You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@thrift.apache.org by Siamak Haschemi <ha...@informatik.hu-berlin.de> on 2008/10/21 12:19:14 UTC

Use Thrift in the OpenWRT platform

Hello,

as you seen here (https://issues.apache.org/jira/browse/THRIFT-177), I
am trying to cross-compile Thrift for the OpenWRT platform
(http://openwrt.org/), which is a Linux distribution for embedded devices.

After a two-night-fight, my result are the following:

- I've created a OpenWRT package for thrift (see the attachment if you
are interested).
- I've successfully compiled the cpp-library (which results in
libthrift, libthriftz and libthriftnb)
- For now, I will not cross-compile the thrift-compiler since I will
compile the thrift definition files on my PC.

Coming to this point, I was very happy and I thought that the story
ends, but now I am faced with a problem I cannot solve myself:

For testing my cross-compilation result, I cross-compiled the cpp-part
of the thrift tutorial. I installed the cross-compiled libraries on the
target device and start the CppServer and the only reaction was
"Segmentation Fault" :-(


I tried to backtrack the problem and I came to the finding, that a
simple hello world program, which is linked to my cross-compiled
thrift-library, causes the "Segmentation Fault". Without linking the
thrift-library, everything is O.K.


=======================
------------
Hello.cpp
------------

#include <iostream>

using namespace std;

int main(int argc, char **argv) {
  printf("Hello World!\n");
  return 0;
}

1) First try

$ i386-linux-uclibc-g++ -L${LIB_DIR} -levent *-lthrift* -o Hello Hello.cpp

On the target device:

root@OpenWrt:~# ./Hello
Segmentation fault

2) Second try

$ i386-linux-uclibc-g++ -L${LIB_DIR} -levent -o Hello Hello.cpp

On the target device:

root@OpenWrt:~# ./Hello
Hello World!

======================

I will try to debug it with gdb, but I'm not an expert in this.


So, please, can someone help me?



Kind regards,

Siamak Haschemi






Re: Use Thrift in the OpenWRT platform

Posted by Siamak Haschemi <ha...@informatik.hu-berlin.de>.
Cello David,

it goes forever. However, dod you read my last post (added -lpthread)?


Kind regards,

Siamak Haschemi

David Reiss schrieb:
> Does the backtrace from the segfault ever get up into Thrift code,
> or is it _pthread_cleanup_push_defer forever?  I suppose this might
> be an incompatibility between Thrift and uClibc.
> 
> Siamak Haschemi wrote:
>> Hello again,
>>
>> now I have some results:
>>
>>> 1/ If you can run your program under gdb, please do so.  When it crashes,
>>> execute the "backtrace" command.  Paste the results.
>> Type "help" followed by a class name for a list of commands in that class.
>> Type "help all" for the list of all commands.
>> Type "help" followed by command name for full documentation.
>> Type "apropos word" to search for commands related to "word".
>> Command name abbreviations are allowed if unambiguous.
>> (gdb) help breakpoints
>> Making program stop at certain points.
>>
>> List of commands:
>>
>> awatch -- Set a watchpoint for an expression
>> break -- Set breakpoint at specified line or function
>> catch -- Set catchpoints to catch events
>> clear -- Clear breakpoint at specified line or function
>> commands -- Set commands to be executed when a breakpoint is hit
>> condition -- Specify breakpoint number N to break only if COND is true
>> delete -- Delete some breakpoints or auto-display expressions
>> delete breakpoints -- Delete some breakpoints or auto-display expressions
>> delete checkpoint -- Delete a fork/checkpoint (experimental)
>> delete display -- Cancel some expressions to be displayed when program stops
>> delete mem -- Delete memory region
>> delete tracepoints -- Delete specified tracepoints
>> disable -- Disable some breakpoints
>> disable breakpoints -- Disable some breakpoints
>> disable display -- Disable some expressions to be displayed when program
>> stops
>> disable mem -- Disable memory region
>> disable tracepoints -- Disable specified tracepoints
>> enable -- Enable some breakpoints
>> enable delete -- Enable breakpoints and delete when hit
>> enable display -- Enable some expressions to be displayed when program stops
>> enable mem -- Enable memory region
>> enable once -- Enable breakpoints for one hit
>> enable tracepoints -- Enable specified tracepoints
>> hbreak -- Set a hardware assisted  breakpoint
>> ignore -- Set ignore-count of breakpoint number N to COUNT
>> rbreak -- Set a breakpoint for all functions matching REGEXP
>> rwatch -- Set a read watchpoint for an expression
>> tbreak -- Set a temporary breakpoint
>> tcatch -- Set temporary catchpoints to catch events
>> thbreak -- Set a temporary hardware assisted breakpoint
>> watch -- Set a watchpoint for an expression
>>
>> Type "help" followed by command name for full documentation.
>> Type "apropos word" to search for commands related to "word".
>> Command name abbreviations are allowed if unambiguous.
>> (gdb) breakpoints clear
>> Undefined command: "breakpoints".  Try "help".
>> (gdb) break clear
>> Function "clear" not defined.
>> Make breakpoint pending on future shared library load? (y or [n]) n
>> (gdb) quit
>> siamak@siamak-desktop:~/seismo-openwrt/trunk/build_dir/i386/root-x86$ gdb
>> GNU gdb 6.8-debian
>> Copyright (C) 2008 Free Software Foundation, Inc.
>> License GPLv3+: GNU GPL version 3 or later
>> <http://gnu.org/licenses/gpl.html>
>> This is free software: you are free to change and redistribute it.
>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>> and "show warranty" for details.
>> This GDB was configured as "i486-linux-gnu".
>> (gdb) >> 1/ If you can run your program under gdb, please do so.  When
>> it crashes,
>> Undefined command: ">>".  Try "help".
>> (gdb) >> execute the "backtrace" command.  Paste the results.Quit
>> (gdb) quit
>> siamak@siamak-desktop:~/seismo-openwrt/trunk/build_dir/i386/root-x86$ gdb
>> GNU gdb 6.8-debian
>> Copyright (C) 2008 Free Software Foundation, Inc.
>> License GPLv3+: GNU GPL version 3 or later
>> <http://gnu.org/licenses/gpl.html>
>> This is free software: you are free to change and redistribute it.
>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>> and "show warranty" for details.
>> This GDB was configured as "i486-linux-gnu".
>> (gdb) set solib-absolute-prefix
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86
>> (gdb) file bin/hello
>> Reading symbols from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/bin/hello...done.
>> (gdb) target remote 141.20.23.212:2345
>> Remote debugging using 141.20.23.212:2345
>> 0xb7f6e910 in _start () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
>> (gdb) continue
>> Continuing.
>>
>> Program received signal SIGSEGV, Segmentation fault.
>> 0xb7dafb0a in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> (gdb) bt
>> #0  0xb7dafb0a in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #1  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #2  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #3  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #4  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #5  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #6  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #7  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #8  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #9  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #10 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #11 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #12 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #13 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #14 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #15 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #16 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #17 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #18 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #19 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> ---Type <return> to continue, or q <return> to quit---
>>
>>> 2/ execute the command "break setrlimit", then "run" (say "yes" when it
>>> asks you if you want to start your program from the beginning).  It should
>>> stop right before calling setrlimit.  Paste the backtrace
>> Breakpoint 1, 0xb7db5aa5 in setrlimit ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> (gdb) bt
>> #0  0xb7db5aa5 in setrlimit () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #1  0xb7d9bb22 in ?? () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
>> #2  0xb7d9c137 in ?? () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
>> #3  0xb7d966c1 in ?? () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
>> #4  0xb7fa73f0 in _dl_get_ready_to_run ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
>> #5  0xb7fa76ea in ?? () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
>> #6  0xb7fa4915 in _start () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
>>
>>
>>
>> Kind regards,
>>
>> Siamak
>>
>> Siamak Haschemi schrieb:
>>> Hello David,
>>>
>>> thank you for helping me!
>>>
>>> I have troubles in setting breakpoints. I'm forced to use gdbserver with
>>> gdb. I replaced the real IP with DEVICE_IP in this E-Mail.
>>>
>>> See my comments below.
>>>
>>> David Reiss schrieb:
>>>> Can you please report the following...
>>>>
>>>> 1/ If you can run your program under gdb, please do so.  When it crashes,
>>>> execute the "backtrace" command.  Paste the results.
>>> GNU gdb 6.8-debian
>>> Copyright (C) 2008 Free Software Foundation, Inc.
>>> License GPLv3+: GNU GPL version 3 or later
>>> <http://gnu.org/licenses/gpl.html>
>>> This is free software: you are free to change and redistribute it.
>>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>>> and "show warranty" for details.
>>> This GDB was configured as "i486-linux-gnu".
>>> (gdb) symbol-file hello
>>> Reading symbols from
>>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
>>> (gdb) target remote DEVICE_IP:2345
>>> Remote debugging using DEVICE_IP:2345
>>> 0xb7f23910 in ?? ()
>>> (gdb) continue
>>> Continuing.
>>>
>>> Program received signal SIGSEGV, Segmentation fault.
>>> 0xb7d6db0a in ?? ()
>>> (gdb) backtrace
>>> #0  0xb7d6db0a in ?? ()
>>> #1  0xb7d6db2b in ?? ()
>>> #2  0xb7d6db2b in ?? ()
>>> #3  0xb7d6db2b in ?? ()
>>> #4  0xb7d6db2b in ?? ()
>>> #5  0xb7d6db2b in ?? ()
>>> #6  0xb7d6db2b in ?? ()
>>> #7  0xb7d6db2b in ?? ()
>>> #8  0xb7d6db2b in ?? ()
>>> #9  0xb7d6db2b in ?? ()
>>> #10 0xb7d6db2b in ?? ()
>>> #11 0xb7d6db2b in ?? ()
>>> #12 0xb7d6db2b in ?? ()
>>> #13 0xb7d6db2b in ?? ()
>>> #14 0xb7d6db2b in ?? ()
>>> #15 0xb7d6db2b in ?? ()
>>> #16 0xb7d6db2b in ?? ()
>>> #17 0xb7d6db2b in ?? ()
>>> #18 0xb7d6db2b in ?? ()
>>> #19 0xb7d6db2b in ?? ()
>>> #20 0xb7d6db2b in ?? ()
>>> #21 0xb7d6db2b in ?? ()
>>> #22 0xb7d6db2b in ?? ()
>>> #23 0xb7d6db2b in ?? ()
>>> #24 0xb7d6db2b in ?? ()
>>> #25 0xb7d6db2b in ?? ()
>>> #26 0xb7d6db2b in ?? ()
>>> #27 0xb7d6db2b in ?? ()
>>> #28 0xb7d6db2b in ?? ()
>>> #29 0xb7d6db2b in ?? ()
>>> #30 0xb7d6db2b in ?? ()
>>> #31 0xb7d6db2b in ?? ()
>>> #32 0xb7d6db2b in ?? ()
>>> #33 0xb7d6db2b in ?? ()
>>> ---Type <return> to continue, or q <return> to quit---
>>> #34 0xb7d6db2b in ?? ()
>>> #35 0xb7d6db2b in ?? ()
>>> #36 0xb7d6db2b in ?? ()
>>> #37 0xb7d6db2b in ?? ()
>>> #38 0xb7d6db2b in ?? ()
>>> #39 0xb7d6db2b in ?? ()
>>> #40 0xb7d6db2b in ?? ()
>>> #41 0xb7d6db2b in ?? ()
>>> #42 0xb7d6db2b in ?? ()
>>> #43 0xb7d6db2b in ?? ()
>>> #44 0xb7d6db2b in ?? ()
>>> #45 0xb7d6db2b in ?? ()
>>> #46 0xb7d6db2b in ?? ()
>>> #47 0xb7d6db2b in ?? ()
>>> #48 0xb7d6db2b in ?? ()
>>> #49 0xb7d6db2b in ?? ()
>>> #50 0xb7d6db2b in ?? ()
>>> #51 0xb7d6db2b in ?? ()
>>> #52 0xb7d6db2b in ?? ()
>>> #53 0xb7d6db2b in ?? ()
>>> #54 0xb7d6db2b in ?? ()
>>> #55 0xb7d6db2b in ?? ()
>>> #56 0xb7d6db2b in ?? ()
>>> #57 0xb7d6db2b in ?? ()
>>> #58 0xb7d6db2b in ?? ()
>>> #59 0xb7d6db2b in ?? ()
>>> #60 0xb7d6db2b in ?? ()
>>> #61 0xb7d6db2b in ?? ()
>>> #62 0xb7d6db2b in ?? ()
>>> #63 0xb7d6db2b in ?? ()
>>> #64 0xb7d6db2b in ?? ()
>>> #65 0xb7d6db2b in ?? ()
>>> #66 0xb7d6db2b in ?? ()
>>> #67 0xb7d6db2b in ?? ()
>>> ---Type <return> to continue, or q <return> to quit---
>>> ... and so on
>>>
>>>> 2/ execute the command "break setrlimit", then "run" (say "yes" when it
>>>> asks you if you want to start your program from the beginning).  It should
>>>> stop right before calling setrlimit.  Paste the backtrace.
>>> GNU gdb 6.8-debian
>>> Copyright (C) 2008 Free Software Foundation, Inc.
>>> License GPLv3+: GNU GPL version 3 or later
>>> <http://gnu.org/licenses/gpl.html>
>>> This is free software: you are free to change and redistribute it.
>>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>>> and "show warranty" for details.
>>> This GDB was configured as "i486-linux-gnu".
>>> (gdb) symbol-file hello
>>> Reading symbols from
>>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
>>> (gdb) target remote DEVICE_IP:2345
>>> Remote debugging using DEVLICE_IP:2345
>>> 0xb7f9c910 in ?? ()
>>> (gdb) break setrlimit
>>> Function "setrlimit" not defined.
>>> Make breakpoint pending on future shared library load? (y or [n]) y
>>> Breakpoint 1 (setrlimit) pending.
>>> (gdb) c
>>> Continuing.
>>>
>>> Program received signal SIGSEGV, Segmentation fault.
>>> 0xb7de6b0a in ?? ()
>>>
>>> :-( gdb does not stop at the breakpoint.
>>>
>>>
>>>
>>>> Please make sure that you have compiled Thrift for debugging.
>>>> ("./configure CXXFLAGS='-O0 -g'").
>>> I run another test in which I force the loading of a library:
>>>
>>> 1)
>>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libz.so.1 echo hello
>>> hello
>>>
>>> 2)
>>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libnl.so.1 echo hello
>>> hello
>>>
>>> 3)
>>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libthrift.so.0 echo hello
>>> Segmentation fault
>>>
>>>
>>> ======
>>>
>>>
>>> And here are some (relevant) outputs from the build:
>>>
>>>
>>> CFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include "
>>>
>>> CXXFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include  -g"
>>>
>>> LDFLAGS="-L/home/siamak/seismo-openwrt/trunk/staging_dir/toolchain-i386_gcc4.1.2/lib
>>> -L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/lib
>>> -L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/lib " make -C
>>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/lib/cpp
>>>
>>> DESTDIR="/home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/ipkg-install"
>>>
>>>
>>> AR=i386-linux-uclibc-ar AS="ccache i386-linux-uclibc-gcc -c -O2 -pipe
>>> -march=i486 -funit-at-a-time -fhonour-copts" LD=i386-linux-uclibc-ld
>>>
>>> NM=i386-linux-uclibc-nm
>>> CC="ccache i386-linux-uclibc-gcc"
>>> GCC="ccache i386-linux-uclibc-gcc"
>>> CXX="i386-linux-uclibc-g++"
>>> RANLIB=i386-linux-uclibc-ranlib
>>> STRIP=i386-linux-uclibc-strip
>>> OBJCOPY=i386-linux-uclibc-objcopy
>>> OBJDUMP=i386-linux-uclibc-objdump
>>> SIZE=i386-linux-uclibc-size
>>> CROSS="i386-linux-uclibc-"
>>> ARCH="i386"
>>>
>>>
>>> i386-linux-uclibc-g++ -DHAVE_CONFIG_H -I. -I. -I../.. -I./src
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include -Wall -O0
>>> -g -MT Monitor.lo -MD -MP -MF .deps/Monitor.Tpo -c
>>> src/concurrency/Monitor.cpp  -fPIC -DPIC -o .libs/Monitor.o
>>>
>>>
>>>> --David
>>>>
>>>> Siamak Haschemi wrote:
>>>>> Hello again,
>>>>>
>>>>> the Hello world program without the thrift library linked shows this
>>>>> strace (only the last relevant lines included):
>>>>>
>>>>>
>>>>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>> ...}) = 0
>>>>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>> ...}) = 0
>>>>> brk(0)                                  = 0x88a7000
>>>>> brk(0x88a8000)                          = 0x88a8000
>>>>> write(1, "Hello World\n", 12Hello World
>>>>> )           = 12
>>>>> _exit(0)
>>>>>
>>>>>
>>>>> For me, it looks like an problem with "getrlimit" or "setrlimit" function.
>>>>>
>>>>> Lind regards,
>>>>>
>>>>> Siamak Haschemi
>>>>>
>>>>> Siamak Haschemi schrieb:
>>>>>> Hello again,
>>>>>>
>>>>>> I don't know if it helps, but here is some more information:
>>>>>>
>>>>>>
>>>>>>
>>>>>> root@OpenWrt:~# ldd ./hello
>>>>>>         libthrift.so.0 => /lib/libthrift.so.0 (0xb7f23000)
>>>>>>         libstdc++.so.6 => /lib/libstdc++.so.6 (0xb7e68000)
>>>>>>         libm.so.0 => /lib/libm.so.0 (0xb7e5b000)
>>>>>>         libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7e52000)
>>>>>>         libc.so.0 => /lib/libc.so.0 (0xb7e08000)
>>>>>>         librt.so.0 => /lib/librt.so.0 (0xb7e05000)
>>>>>>         libpthread.so.0 => /lib/libpthread.so.0 (0xb7df3000)
>>>>>>         ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb7fb9000)
>>>>>>
>>>>>>
>>>>>>
>>>>>> root@OpenWrt:~# strace ./hello
>>>>>> execve("/bin/hello", ["/bin/hello"], [/* 8 vars */]) = 0
>>>>>> mmap2(NULL, 20, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
>>>>>> = 0xb7f52000
>>>>>> stat("/etc/ld.so.cache", 0xbff56254)    = -1 ENOENT (No such file or
>>>>>> directory)
>>>>>> open("/lib/libthrift.so.0", O_RDONLY)   = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=604571, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20q\2\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 606208, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>>> 0xb7ebd000
>>>>>> mmap2(0xb7ebd000, 591833, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7ebd000
>>>>>> mmap2(0xb7f4e000, 10651, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0x91) = 0xb7f4e000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0,\0\4\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 765952, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>>> 0xb7e02000
>>>>>> mmap2(0xb7e02000, 719316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7e02000
>>>>>> mmap2(0xb7eb2000, 20473, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0xb0) = 0xb7eb2000
>>>>>> mmap2(0xb7eb7000, 23828, PROT_READ|PROT_WRITE,
>>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7eb7000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0t\21\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 53248, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7df5000
>>>>>> mmap2(0xb7df5000, 41028, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7df5000
>>>>>> mmap2(0xb7e00000, 4120, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0xa) = 0xb7e00000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0H\25\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 36864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7dec000
>>>>>> mmap2(0xb7dec000, 31592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7dec000
>>>>>> mmap2(0xb7df4000, 3302, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0x7) = 0xb7df4000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\251\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 303104, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>>> 0xb7da2000
>>>>>> mmap2(0xb7da2000, 271528, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7da2000
>>>>>> mmap2(0xb7de5000, 5309, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0x42) = 0xb7de5000
>>>>>> mmap2(0xb7de7000, 16988, PROT_READ|PROT_WRITE,
>>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7de7000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/librt.so.0", O_RDONLY)       = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=4110, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\344\4\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 12288, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d9f000
>>>>>> mmap2(0xb7d9f000, 2336, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7d9f000
>>>>>> mmap2(0xb7da0000, 4110, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7da0000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libpthread.so.0", O_RDONLY)  = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=58930, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0004=\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 73728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d8d000
>>>>>> mmap2(0xb7d8d000, 37304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7d8d000
>>>>>> mmap2(0xb7d97000, 22066, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0x9) = 0xb7d97000
>>>>>> mmap2(0xb7d9d000, 6232, PROT_READ|PROT_WRITE,
>>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7d9d000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=16390, ...}) = 0
>>>>>> mprotect(0xb7eb2000, 16384, PROT_READ)  = 0
>>>>>> mprotect(0xb7e00000, 4096, PROT_READ)   = 0
>>>>>> mprotect(0xb7de5000, 4096, PROT_READ)   = 0
>>>>>> mprotect(0xb7da0000, 4096, PROT_READ)   = 0
>>>>>> mprotect(0xb7d97000, 4096, PROT_READ)   = 0
>>>>>> mprotect(0xb7f57000, 4096, PROT_READ)   = 0
>>>>>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>>> ...}) = 0
>>>>>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>>> ...}) = 0
>>>>>> getpid()                                = 2933
>>>>>> getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
>>>>>> setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=RLIM_INFINITY}) = 0
>>>>>> rt_sigaction(SIGRTMIN, {0xb7d95f96, [], SA_RESTORER, 0xb7dac998}, NULL,
>>>>>> 8) = 0
>>>>>> rt_sigaction(SIGRT_1, {0xb7d95efe, [RTMIN], SA_RESTORER, 0xb7dac998},
>>>>>> NULL, 8) = 0
>>>>>> rt_sigaction(SIGRT_2, {0xb7d9562a, [], SA_RESTORER, 0xb7dac998}, NULL,
>>>>>> 8) = 0
>>>>>> rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
>>>>>> rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 8) = 0
>>>>>> --- SIGSEGV (Segmentation fault) @ 0 (0) ---
>>>>>> +++ killed by SIGSEGV +++
>>>>>>
>>>>>>
>>>>>>
>>>>>> Kind regards,
>>>>>>
>>>>>> Siamak Haschemi
>>>>>>
>>>>>> Siamak Haschemi schrieb:
>>>>>>> Hello,
>>>>>>>
>>>>>>> as you seen here (https://issues.apache.org/jira/browse/THRIFT-177), I
>>>>>>> am trying to cross-compile Thrift for the OpenWRT platform
>>>>>>> (http://openwrt.org/), which is a Linux distribution for embedded devices.
>>>>>>>
>>>>>>> After a two-night-fight, my result are the following:
>>>>>>>
>>>>>>> - I've created a OpenWRT package for thrift (see the attachment if you
>>>>>>> are interested).
>>>>>>> - I've successfully compiled the cpp-library (which results in
>>>>>>> libthrift, libthriftz and libthriftnb)
>>>>>>> - For now, I will not cross-compile the thrift-compiler since I will
>>>>>>> compile the thrift definition files on my PC.
>>>>>>>
>>>>>>> Coming to this point, I was very happy and I thought that the story
>>>>>>> ends, but now I am faced with a problem I cannot solve myself:
>>>>>>>
>>>>>>> For testing my cross-compilation result, I cross-compiled the cpp-part
>>>>>>> of the thrift tutorial. I installed the cross-compiled libraries on the
>>>>>>> target device and start the CppServer and the only reaction was
>>>>>>> "Segmentation Fault" :-(
>>>>>>>
>>>>>>>
>>>>>>> I tried to backtrack the problem and I came to the finding, that a
>>>>>>> simple hello world program, which is linked to my cross-compiled
>>>>>>> thrift-library, causes the "Segmentation Fault". Without linking the
>>>>>>> thrift-library, everything is O.K.
>>>>>>>
>>>>>>>
>>>>>>> =======================
>>>>>>> ------------
>>>>>>> Hello.cpp
>>>>>>> ------------
>>>>>>>
>>>>>>> #include <iostream>
>>>>>>>
>>>>>>> using namespace std;
>>>>>>>
>>>>>>> int main(int argc, char **argv) {
>>>>>>>   printf("Hello World!\n");
>>>>>>>   return 0;
>>>>>>> }
>>>>>>>
>>>>>>> 1) First try
>>>>>>>
>>>>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent *-lthrift* -o Hello Hello.cpp
>>>>>>>
>>>>>>> On the target device:
>>>>>>>
>>>>>>> root@OpenWrt:~# ./Hello
>>>>>>> Segmentation fault
>>>>>>>
>>>>>>> 2) Second try
>>>>>>>
>>>>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent -o Hello Hello.cpp
>>>>>>>
>>>>>>> On the target device:
>>>>>>>
>>>>>>> root@OpenWrt:~# ./Hello
>>>>>>> Hello World!
>>>>>>>
>>>>>>> ======================
>>>>>>>
>>>>>>> I will try to debug it with gdb, but I'm not an expert in this.
>>>>>>>
>>>>>>>
>>>>>>> So, please, can someone help me?
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Kind regards,
>>>>>>>
>>>>>>> Siamak Haschemi
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>

Re: Use Thrift in the OpenWRT platform

Posted by Siamak Haschemi <ha...@informatik.hu-berlin.de>.
Cello David,

it goes forever. However, did you read my last post (added -lpthread)?


Kind regards,

Siamak Haschemi

David Reiss schrieb:
> Does the backtrace from the segfault ever get up into Thrift code,
> or is it _pthread_cleanup_push_defer forever?  I suppose this might
> be an incompatibility between Thrift and uClibc.
> 
> Siamak Haschemi wrote:
>> Hello again,
>>
>> now I have some results:
>>
>>> 1/ If you can run your program under gdb, please do so.  When it crashes,
>>> execute the "backtrace" command.  Paste the results.
>> Type "help" followed by a class name for a list of commands in that class.
>> Type "help all" for the list of all commands.
>> Type "help" followed by command name for full documentation.
>> Type "apropos word" to search for commands related to "word".
>> Command name abbreviations are allowed if unambiguous.
>> (gdb) help breakpoints
>> Making program stop at certain points.
>>
>> List of commands:
>>
>> awatch -- Set a watchpoint for an expression
>> break -- Set breakpoint at specified line or function
>> catch -- Set catchpoints to catch events
>> clear -- Clear breakpoint at specified line or function
>> commands -- Set commands to be executed when a breakpoint is hit
>> condition -- Specify breakpoint number N to break only if COND is true
>> delete -- Delete some breakpoints or auto-display expressions
>> delete breakpoints -- Delete some breakpoints or auto-display expressions
>> delete checkpoint -- Delete a fork/checkpoint (experimental)
>> delete display -- Cancel some expressions to be displayed when program stops
>> delete mem -- Delete memory region
>> delete tracepoints -- Delete specified tracepoints
>> disable -- Disable some breakpoints
>> disable breakpoints -- Disable some breakpoints
>> disable display -- Disable some expressions to be displayed when program
>> stops
>> disable mem -- Disable memory region
>> disable tracepoints -- Disable specified tracepoints
>> enable -- Enable some breakpoints
>> enable delete -- Enable breakpoints and delete when hit
>> enable display -- Enable some expressions to be displayed when program stops
>> enable mem -- Enable memory region
>> enable once -- Enable breakpoints for one hit
>> enable tracepoints -- Enable specified tracepoints
>> hbreak -- Set a hardware assisted  breakpoint
>> ignore -- Set ignore-count of breakpoint number N to COUNT
>> rbreak -- Set a breakpoint for all functions matching REGEXP
>> rwatch -- Set a read watchpoint for an expression
>> tbreak -- Set a temporary breakpoint
>> tcatch -- Set temporary catchpoints to catch events
>> thbreak -- Set a temporary hardware assisted breakpoint
>> watch -- Set a watchpoint for an expression
>>
>> Type "help" followed by command name for full documentation.
>> Type "apropos word" to search for commands related to "word".
>> Command name abbreviations are allowed if unambiguous.
>> (gdb) breakpoints clear
>> Undefined command: "breakpoints".  Try "help".
>> (gdb) break clear
>> Function "clear" not defined.
>> Make breakpoint pending on future shared library load? (y or [n]) n
>> (gdb) quit
>> siamak@siamak-desktop:~/seismo-openwrt/trunk/build_dir/i386/root-x86$ gdb
>> GNU gdb 6.8-debian
>> Copyright (C) 2008 Free Software Foundation, Inc.
>> License GPLv3+: GNU GPL version 3 or later
>> <http://gnu.org/licenses/gpl.html>
>> This is free software: you are free to change and redistribute it.
>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>> and "show warranty" for details.
>> This GDB was configured as "i486-linux-gnu".
>> (gdb) >> 1/ If you can run your program under gdb, please do so.  When
>> it crashes,
>> Undefined command: ">>".  Try "help".
>> (gdb) >> execute the "backtrace" command.  Paste the results.Quit
>> (gdb) quit
>> siamak@siamak-desktop:~/seismo-openwrt/trunk/build_dir/i386/root-x86$ gdb
>> GNU gdb 6.8-debian
>> Copyright (C) 2008 Free Software Foundation, Inc.
>> License GPLv3+: GNU GPL version 3 or later
>> <http://gnu.org/licenses/gpl.html>
>> This is free software: you are free to change and redistribute it.
>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>> and "show warranty" for details.
>> This GDB was configured as "i486-linux-gnu".
>> (gdb) set solib-absolute-prefix
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86
>> (gdb) file bin/hello
>> Reading symbols from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/bin/hello...done.
>> (gdb) target remote 141.20.23.212:2345
>> Remote debugging using 141.20.23.212:2345
>> 0xb7f6e910 in _start () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
>> (gdb) continue
>> Continuing.
>>
>> Program received signal SIGSEGV, Segmentation fault.
>> 0xb7dafb0a in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> (gdb) bt
>> #0  0xb7dafb0a in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #1  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #2  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #3  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #4  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #5  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #6  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #7  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #8  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #9  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #10 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #11 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #12 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #13 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #14 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #15 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #16 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #17 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #18 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #19 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> ---Type <return> to continue, or q <return> to quit---
>>
>>> 2/ execute the command "break setrlimit", then "run" (say "yes" when it
>>> asks you if you want to start your program from the beginning).  It should
>>> stop right before calling setrlimit.  Paste the backtrace
>> Breakpoint 1, 0xb7db5aa5 in setrlimit ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> (gdb) bt
>> #0  0xb7db5aa5 in setrlimit () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #1  0xb7d9bb22 in ?? () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
>> #2  0xb7d9c137 in ?? () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
>> #3  0xb7d966c1 in ?? () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
>> #4  0xb7fa73f0 in _dl_get_ready_to_run ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
>> #5  0xb7fa76ea in ?? () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
>> #6  0xb7fa4915 in _start () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
>>
>>
>>
>> Kind regards,
>>
>> Siamak
>>
>> Siamak Haschemi schrieb:
>>> Hello David,
>>>
>>> thank you for helping me!
>>>
>>> I have troubles in setting breakpoints. I'm forced to use gdbserver with
>>> gdb. I replaced the real IP with DEVICE_IP in this E-Mail.
>>>
>>> See my comments below.
>>>
>>> David Reiss schrieb:
>>>> Can you please report the following...
>>>>
>>>> 1/ If you can run your program under gdb, please do so.  When it crashes,
>>>> execute the "backtrace" command.  Paste the results.
>>> GNU gdb 6.8-debian
>>> Copyright (C) 2008 Free Software Foundation, Inc.
>>> License GPLv3+: GNU GPL version 3 or later
>>> <http://gnu.org/licenses/gpl.html>
>>> This is free software: you are free to change and redistribute it.
>>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>>> and "show warranty" for details.
>>> This GDB was configured as "i486-linux-gnu".
>>> (gdb) symbol-file hello
>>> Reading symbols from
>>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
>>> (gdb) target remote DEVICE_IP:2345
>>> Remote debugging using DEVICE_IP:2345
>>> 0xb7f23910 in ?? ()
>>> (gdb) continue
>>> Continuing.
>>>
>>> Program received signal SIGSEGV, Segmentation fault.
>>> 0xb7d6db0a in ?? ()
>>> (gdb) backtrace
>>> #0  0xb7d6db0a in ?? ()
>>> #1  0xb7d6db2b in ?? ()
>>> #2  0xb7d6db2b in ?? ()
>>> #3  0xb7d6db2b in ?? ()
>>> #4  0xb7d6db2b in ?? ()
>>> #5  0xb7d6db2b in ?? ()
>>> #6  0xb7d6db2b in ?? ()
>>> #7  0xb7d6db2b in ?? ()
>>> #8  0xb7d6db2b in ?? ()
>>> #9  0xb7d6db2b in ?? ()
>>> #10 0xb7d6db2b in ?? ()
>>> #11 0xb7d6db2b in ?? ()
>>> #12 0xb7d6db2b in ?? ()
>>> #13 0xb7d6db2b in ?? ()
>>> #14 0xb7d6db2b in ?? ()
>>> #15 0xb7d6db2b in ?? ()
>>> #16 0xb7d6db2b in ?? ()
>>> #17 0xb7d6db2b in ?? ()
>>> #18 0xb7d6db2b in ?? ()
>>> #19 0xb7d6db2b in ?? ()
>>> #20 0xb7d6db2b in ?? ()
>>> #21 0xb7d6db2b in ?? ()
>>> #22 0xb7d6db2b in ?? ()
>>> #23 0xb7d6db2b in ?? ()
>>> #24 0xb7d6db2b in ?? ()
>>> #25 0xb7d6db2b in ?? ()
>>> #26 0xb7d6db2b in ?? ()
>>> #27 0xb7d6db2b in ?? ()
>>> #28 0xb7d6db2b in ?? ()
>>> #29 0xb7d6db2b in ?? ()
>>> #30 0xb7d6db2b in ?? ()
>>> #31 0xb7d6db2b in ?? ()
>>> #32 0xb7d6db2b in ?? ()
>>> #33 0xb7d6db2b in ?? ()
>>> ---Type <return> to continue, or q <return> to quit---
>>> #34 0xb7d6db2b in ?? ()
>>> #35 0xb7d6db2b in ?? ()
>>> #36 0xb7d6db2b in ?? ()
>>> #37 0xb7d6db2b in ?? ()
>>> #38 0xb7d6db2b in ?? ()
>>> #39 0xb7d6db2b in ?? ()
>>> #40 0xb7d6db2b in ?? ()
>>> #41 0xb7d6db2b in ?? ()
>>> #42 0xb7d6db2b in ?? ()
>>> #43 0xb7d6db2b in ?? ()
>>> #44 0xb7d6db2b in ?? ()
>>> #45 0xb7d6db2b in ?? ()
>>> #46 0xb7d6db2b in ?? ()
>>> #47 0xb7d6db2b in ?? ()
>>> #48 0xb7d6db2b in ?? ()
>>> #49 0xb7d6db2b in ?? ()
>>> #50 0xb7d6db2b in ?? ()
>>> #51 0xb7d6db2b in ?? ()
>>> #52 0xb7d6db2b in ?? ()
>>> #53 0xb7d6db2b in ?? ()
>>> #54 0xb7d6db2b in ?? ()
>>> #55 0xb7d6db2b in ?? ()
>>> #56 0xb7d6db2b in ?? ()
>>> #57 0xb7d6db2b in ?? ()
>>> #58 0xb7d6db2b in ?? ()
>>> #59 0xb7d6db2b in ?? ()
>>> #60 0xb7d6db2b in ?? ()
>>> #61 0xb7d6db2b in ?? ()
>>> #62 0xb7d6db2b in ?? ()
>>> #63 0xb7d6db2b in ?? ()
>>> #64 0xb7d6db2b in ?? ()
>>> #65 0xb7d6db2b in ?? ()
>>> #66 0xb7d6db2b in ?? ()
>>> #67 0xb7d6db2b in ?? ()
>>> ---Type <return> to continue, or q <return> to quit---
>>> ... and so on
>>>
>>>> 2/ execute the command "break setrlimit", then "run" (say "yes" when it
>>>> asks you if you want to start your program from the beginning).  It should
>>>> stop right before calling setrlimit.  Paste the backtrace.
>>> GNU gdb 6.8-debian
>>> Copyright (C) 2008 Free Software Foundation, Inc.
>>> License GPLv3+: GNU GPL version 3 or later
>>> <http://gnu.org/licenses/gpl.html>
>>> This is free software: you are free to change and redistribute it.
>>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>>> and "show warranty" for details.
>>> This GDB was configured as "i486-linux-gnu".
>>> (gdb) symbol-file hello
>>> Reading symbols from
>>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
>>> (gdb) target remote DEVICE_IP:2345
>>> Remote debugging using DEVLICE_IP:2345
>>> 0xb7f9c910 in ?? ()
>>> (gdb) break setrlimit
>>> Function "setrlimit" not defined.
>>> Make breakpoint pending on future shared library load? (y or [n]) y
>>> Breakpoint 1 (setrlimit) pending.
>>> (gdb) c
>>> Continuing.
>>>
>>> Program received signal SIGSEGV, Segmentation fault.
>>> 0xb7de6b0a in ?? ()
>>>
>>> :-( gdb does not stop at the breakpoint.
>>>
>>>
>>>
>>>> Please make sure that you have compiled Thrift for debugging.
>>>> ("./configure CXXFLAGS='-O0 -g'").
>>> I run another test in which I force the loading of a library:
>>>
>>> 1)
>>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libz.so.1 echo hello
>>> hello
>>>
>>> 2)
>>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libnl.so.1 echo hello
>>> hello
>>>
>>> 3)
>>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libthrift.so.0 echo hello
>>> Segmentation fault
>>>
>>>
>>> ======
>>>
>>>
>>> And here are some (relevant) outputs from the build:
>>>
>>>
>>> CFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include "
>>>
>>> CXXFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include  -g"
>>>
>>> LDFLAGS="-L/home/siamak/seismo-openwrt/trunk/staging_dir/toolchain-i386_gcc4.1.2/lib
>>> -L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/lib
>>> -L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/lib " make -C
>>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/lib/cpp
>>>
>>> DESTDIR="/home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/ipkg-install"
>>>
>>>
>>> AR=i386-linux-uclibc-ar AS="ccache i386-linux-uclibc-gcc -c -O2 -pipe
>>> -march=i486 -funit-at-a-time -fhonour-copts" LD=i386-linux-uclibc-ld
>>>
>>> NM=i386-linux-uclibc-nm
>>> CC="ccache i386-linux-uclibc-gcc"
>>> GCC="ccache i386-linux-uclibc-gcc"
>>> CXX="i386-linux-uclibc-g++"
>>> RANLIB=i386-linux-uclibc-ranlib
>>> STRIP=i386-linux-uclibc-strip
>>> OBJCOPY=i386-linux-uclibc-objcopy
>>> OBJDUMP=i386-linux-uclibc-objdump
>>> SIZE=i386-linux-uclibc-size
>>> CROSS="i386-linux-uclibc-"
>>> ARCH="i386"
>>>
>>>
>>> i386-linux-uclibc-g++ -DHAVE_CONFIG_H -I. -I. -I../.. -I./src
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include -Wall -O0
>>> -g -MT Monitor.lo -MD -MP -MF .deps/Monitor.Tpo -c
>>> src/concurrency/Monitor.cpp  -fPIC -DPIC -o .libs/Monitor.o
>>>
>>>
>>>> --David
>>>>
>>>> Siamak Haschemi wrote:
>>>>> Hello again,
>>>>>
>>>>> the Hello world program without the thrift library linked shows this
>>>>> strace (only the last relevant lines included):
>>>>>
>>>>>
>>>>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>> ...}) = 0
>>>>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>> ...}) = 0
>>>>> brk(0)                                  = 0x88a7000
>>>>> brk(0x88a8000)                          = 0x88a8000
>>>>> write(1, "Hello World\n", 12Hello World
>>>>> )           = 12
>>>>> _exit(0)
>>>>>
>>>>>
>>>>> For me, it looks like an problem with "getrlimit" or "setrlimit" function.
>>>>>
>>>>> Lind regards,
>>>>>
>>>>> Siamak Haschemi
>>>>>
>>>>> Siamak Haschemi schrieb:
>>>>>> Hello again,
>>>>>>
>>>>>> I don't know if it helps, but here is some more information:
>>>>>>
>>>>>>
>>>>>>
>>>>>> root@OpenWrt:~# ldd ./hello
>>>>>>         libthrift.so.0 => /lib/libthrift.so.0 (0xb7f23000)
>>>>>>         libstdc++.so.6 => /lib/libstdc++.so.6 (0xb7e68000)
>>>>>>         libm.so.0 => /lib/libm.so.0 (0xb7e5b000)
>>>>>>         libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7e52000)
>>>>>>         libc.so.0 => /lib/libc.so.0 (0xb7e08000)
>>>>>>         librt.so.0 => /lib/librt.so.0 (0xb7e05000)
>>>>>>         libpthread.so.0 => /lib/libpthread.so.0 (0xb7df3000)
>>>>>>         ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb7fb9000)
>>>>>>
>>>>>>
>>>>>>
>>>>>> root@OpenWrt:~# strace ./hello
>>>>>> execve("/bin/hello", ["/bin/hello"], [/* 8 vars */]) = 0
>>>>>> mmap2(NULL, 20, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
>>>>>> = 0xb7f52000
>>>>>> stat("/etc/ld.so.cache", 0xbff56254)    = -1 ENOENT (No such file or
>>>>>> directory)
>>>>>> open("/lib/libthrift.so.0", O_RDONLY)   = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=604571, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20q\2\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 606208, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>>> 0xb7ebd000
>>>>>> mmap2(0xb7ebd000, 591833, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7ebd000
>>>>>> mmap2(0xb7f4e000, 10651, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0x91) = 0xb7f4e000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0,\0\4\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 765952, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>>> 0xb7e02000
>>>>>> mmap2(0xb7e02000, 719316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7e02000
>>>>>> mmap2(0xb7eb2000, 20473, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0xb0) = 0xb7eb2000
>>>>>> mmap2(0xb7eb7000, 23828, PROT_READ|PROT_WRITE,
>>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7eb7000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0t\21\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 53248, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7df5000
>>>>>> mmap2(0xb7df5000, 41028, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7df5000
>>>>>> mmap2(0xb7e00000, 4120, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0xa) = 0xb7e00000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0H\25\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 36864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7dec000
>>>>>> mmap2(0xb7dec000, 31592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7dec000
>>>>>> mmap2(0xb7df4000, 3302, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0x7) = 0xb7df4000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\251\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 303104, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>>> 0xb7da2000
>>>>>> mmap2(0xb7da2000, 271528, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7da2000
>>>>>> mmap2(0xb7de5000, 5309, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0x42) = 0xb7de5000
>>>>>> mmap2(0xb7de7000, 16988, PROT_READ|PROT_WRITE,
>>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7de7000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/librt.so.0", O_RDONLY)       = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=4110, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\344\4\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 12288, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d9f000
>>>>>> mmap2(0xb7d9f000, 2336, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7d9f000
>>>>>> mmap2(0xb7da0000, 4110, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7da0000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libpthread.so.0", O_RDONLY)  = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=58930, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0004=\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 73728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d8d000
>>>>>> mmap2(0xb7d8d000, 37304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7d8d000
>>>>>> mmap2(0xb7d97000, 22066, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0x9) = 0xb7d97000
>>>>>> mmap2(0xb7d9d000, 6232, PROT_READ|PROT_WRITE,
>>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7d9d000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=16390, ...}) = 0
>>>>>> mprotect(0xb7eb2000, 16384, PROT_READ)  = 0
>>>>>> mprotect(0xb7e00000, 4096, PROT_READ)   = 0
>>>>>> mprotect(0xb7de5000, 4096, PROT_READ)   = 0
>>>>>> mprotect(0xb7da0000, 4096, PROT_READ)   = 0
>>>>>> mprotect(0xb7d97000, 4096, PROT_READ)   = 0
>>>>>> mprotect(0xb7f57000, 4096, PROT_READ)   = 0
>>>>>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>>> ...}) = 0
>>>>>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>>> ...}) = 0
>>>>>> getpid()                                = 2933
>>>>>> getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
>>>>>> setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=RLIM_INFINITY}) = 0
>>>>>> rt_sigaction(SIGRTMIN, {0xb7d95f96, [], SA_RESTORER, 0xb7dac998}, NULL,
>>>>>> 8) = 0
>>>>>> rt_sigaction(SIGRT_1, {0xb7d95efe, [RTMIN], SA_RESTORER, 0xb7dac998},
>>>>>> NULL, 8) = 0
>>>>>> rt_sigaction(SIGRT_2, {0xb7d9562a, [], SA_RESTORER, 0xb7dac998}, NULL,
>>>>>> 8) = 0
>>>>>> rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
>>>>>> rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 8) = 0
>>>>>> --- SIGSEGV (Segmentation fault) @ 0 (0) ---
>>>>>> +++ killed by SIGSEGV +++
>>>>>>
>>>>>>
>>>>>>
>>>>>> Kind regards,
>>>>>>
>>>>>> Siamak Haschemi
>>>>>>
>>>>>> Siamak Haschemi schrieb:
>>>>>>> Hello,
>>>>>>>
>>>>>>> as you seen here (https://issues.apache.org/jira/browse/THRIFT-177), I
>>>>>>> am trying to cross-compile Thrift for the OpenWRT platform
>>>>>>> (http://openwrt.org/), which is a Linux distribution for embedded devices.
>>>>>>>
>>>>>>> After a two-night-fight, my result are the following:
>>>>>>>
>>>>>>> - I've created a OpenWRT package for thrift (see the attachment if you
>>>>>>> are interested).
>>>>>>> - I've successfully compiled the cpp-library (which results in
>>>>>>> libthrift, libthriftz and libthriftnb)
>>>>>>> - For now, I will not cross-compile the thrift-compiler since I will
>>>>>>> compile the thrift definition files on my PC.
>>>>>>>
>>>>>>> Coming to this point, I was very happy and I thought that the story
>>>>>>> ends, but now I am faced with a problem I cannot solve myself:
>>>>>>>
>>>>>>> For testing my cross-compilation result, I cross-compiled the cpp-part
>>>>>>> of the thrift tutorial. I installed the cross-compiled libraries on the
>>>>>>> target device and start the CppServer and the only reaction was
>>>>>>> "Segmentation Fault" :-(
>>>>>>>
>>>>>>>
>>>>>>> I tried to backtrack the problem and I came to the finding, that a
>>>>>>> simple hello world program, which is linked to my cross-compiled
>>>>>>> thrift-library, causes the "Segmentation Fault". Without linking the
>>>>>>> thrift-library, everything is O.K.
>>>>>>>
>>>>>>>
>>>>>>> =======================
>>>>>>> ------------
>>>>>>> Hello.cpp
>>>>>>> ------------
>>>>>>>
>>>>>>> #include <iostream>
>>>>>>>
>>>>>>> using namespace std;
>>>>>>>
>>>>>>> int main(int argc, char **argv) {
>>>>>>>   printf("Hello World!\n");
>>>>>>>   return 0;
>>>>>>> }
>>>>>>>
>>>>>>> 1) First try
>>>>>>>
>>>>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent *-lthrift* -o Hello Hello.cpp
>>>>>>>
>>>>>>> On the target device:
>>>>>>>
>>>>>>> root@OpenWrt:~# ./Hello
>>>>>>> Segmentation fault
>>>>>>>
>>>>>>> 2) Second try
>>>>>>>
>>>>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent -o Hello Hello.cpp
>>>>>>>
>>>>>>> On the target device:
>>>>>>>
>>>>>>> root@OpenWrt:~# ./Hello
>>>>>>> Hello World!
>>>>>>>
>>>>>>> ======================
>>>>>>>
>>>>>>> I will try to debug it with gdb, but I'm not an expert in this.
>>>>>>>
>>>>>>>
>>>>>>> So, please, can someone help me?
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Kind regards,
>>>>>>>
>>>>>>> Siamak Haschemi
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>

Re: Use Thrift in the OpenWRT platform

Posted by David Reiss <dr...@facebook.com>.
Does the backtrace from the segfault ever get up into Thrift code,
or is it _pthread_cleanup_push_defer forever?  I suppose this might
be an incompatibility between Thrift and uClibc.

Siamak Haschemi wrote:
> Hello again,
> 
> now I have some results:
> 
>> 1/ If you can run your program under gdb, please do so.  When it crashes,
>> execute the "backtrace" command.  Paste the results.
> 
> Type "help" followed by a class name for a list of commands in that class.
> Type "help all" for the list of all commands.
> Type "help" followed by command name for full documentation.
> Type "apropos word" to search for commands related to "word".
> Command name abbreviations are allowed if unambiguous.
> (gdb) help breakpoints
> Making program stop at certain points.
> 
> List of commands:
> 
> awatch -- Set a watchpoint for an expression
> break -- Set breakpoint at specified line or function
> catch -- Set catchpoints to catch events
> clear -- Clear breakpoint at specified line or function
> commands -- Set commands to be executed when a breakpoint is hit
> condition -- Specify breakpoint number N to break only if COND is true
> delete -- Delete some breakpoints or auto-display expressions
> delete breakpoints -- Delete some breakpoints or auto-display expressions
> delete checkpoint -- Delete a fork/checkpoint (experimental)
> delete display -- Cancel some expressions to be displayed when program stops
> delete mem -- Delete memory region
> delete tracepoints -- Delete specified tracepoints
> disable -- Disable some breakpoints
> disable breakpoints -- Disable some breakpoints
> disable display -- Disable some expressions to be displayed when program
> stops
> disable mem -- Disable memory region
> disable tracepoints -- Disable specified tracepoints
> enable -- Enable some breakpoints
> enable delete -- Enable breakpoints and delete when hit
> enable display -- Enable some expressions to be displayed when program stops
> enable mem -- Enable memory region
> enable once -- Enable breakpoints for one hit
> enable tracepoints -- Enable specified tracepoints
> hbreak -- Set a hardware assisted  breakpoint
> ignore -- Set ignore-count of breakpoint number N to COUNT
> rbreak -- Set a breakpoint for all functions matching REGEXP
> rwatch -- Set a read watchpoint for an expression
> tbreak -- Set a temporary breakpoint
> tcatch -- Set temporary catchpoints to catch events
> thbreak -- Set a temporary hardware assisted breakpoint
> watch -- Set a watchpoint for an expression
> 
> Type "help" followed by command name for full documentation.
> Type "apropos word" to search for commands related to "word".
> Command name abbreviations are allowed if unambiguous.
> (gdb) breakpoints clear
> Undefined command: "breakpoints".  Try "help".
> (gdb) break clear
> Function "clear" not defined.
> Make breakpoint pending on future shared library load? (y or [n]) n
> (gdb) quit
> siamak@siamak-desktop:~/seismo-openwrt/trunk/build_dir/i386/root-x86$ gdb
> GNU gdb 6.8-debian
> Copyright (C) 2008 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later
> <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "i486-linux-gnu".
> (gdb) >> 1/ If you can run your program under gdb, please do so.  When
> it crashes,
> Undefined command: ">>".  Try "help".
> (gdb) >> execute the "backtrace" command.  Paste the results.Quit
> (gdb) quit
> siamak@siamak-desktop:~/seismo-openwrt/trunk/build_dir/i386/root-x86$ gdb
> GNU gdb 6.8-debian
> Copyright (C) 2008 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later
> <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "i486-linux-gnu".
> (gdb) set solib-absolute-prefix
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86
> (gdb) file bin/hello
> Reading symbols from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/bin/hello...done.
> (gdb) target remote 141.20.23.212:2345
> Remote debugging using 141.20.23.212:2345
> 0xb7f6e910 in _start () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
> (gdb) continue
> Continuing.
> 
> Program received signal SIGSEGV, Segmentation fault.
> 0xb7dafb0a in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> (gdb) bt
> #0  0xb7dafb0a in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #1  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #2  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #3  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #4  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #5  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #6  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #7  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #8  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #9  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #10 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #11 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #12 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #13 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #14 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #15 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #16 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #17 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #18 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #19 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> ---Type <return> to continue, or q <return> to quit---
> 
>> 2/ execute the command "break setrlimit", then "run" (say "yes" when it
>> asks you if you want to start your program from the beginning).  It should
>> stop right before calling setrlimit.  Paste the backtrace
> 
> Breakpoint 1, 0xb7db5aa5 in setrlimit ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> (gdb) bt
> #0  0xb7db5aa5 in setrlimit () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #1  0xb7d9bb22 in ?? () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
> #2  0xb7d9c137 in ?? () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
> #3  0xb7d966c1 in ?? () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
> #4  0xb7fa73f0 in _dl_get_ready_to_run ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
> #5  0xb7fa76ea in ?? () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
> #6  0xb7fa4915 in _start () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
> 
> 
> 
> Kind regards,
> 
> Siamak
> 
> Siamak Haschemi schrieb:
>> Hello David,
>>
>> thank you for helping me!
>>
>> I have troubles in setting breakpoints. I'm forced to use gdbserver with
>> gdb. I replaced the real IP with DEVICE_IP in this E-Mail.
>>
>> See my comments below.
>>
>> David Reiss schrieb:
>>> Can you please report the following...
>>>
>>> 1/ If you can run your program under gdb, please do so.  When it crashes,
>>> execute the "backtrace" command.  Paste the results.
>> GNU gdb 6.8-debian
>> Copyright (C) 2008 Free Software Foundation, Inc.
>> License GPLv3+: GNU GPL version 3 or later
>> <http://gnu.org/licenses/gpl.html>
>> This is free software: you are free to change and redistribute it.
>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>> and "show warranty" for details.
>> This GDB was configured as "i486-linux-gnu".
>> (gdb) symbol-file hello
>> Reading symbols from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
>> (gdb) target remote DEVICE_IP:2345
>> Remote debugging using DEVICE_IP:2345
>> 0xb7f23910 in ?? ()
>> (gdb) continue
>> Continuing.
>>
>> Program received signal SIGSEGV, Segmentation fault.
>> 0xb7d6db0a in ?? ()
>> (gdb) backtrace
>> #0  0xb7d6db0a in ?? ()
>> #1  0xb7d6db2b in ?? ()
>> #2  0xb7d6db2b in ?? ()
>> #3  0xb7d6db2b in ?? ()
>> #4  0xb7d6db2b in ?? ()
>> #5  0xb7d6db2b in ?? ()
>> #6  0xb7d6db2b in ?? ()
>> #7  0xb7d6db2b in ?? ()
>> #8  0xb7d6db2b in ?? ()
>> #9  0xb7d6db2b in ?? ()
>> #10 0xb7d6db2b in ?? ()
>> #11 0xb7d6db2b in ?? ()
>> #12 0xb7d6db2b in ?? ()
>> #13 0xb7d6db2b in ?? ()
>> #14 0xb7d6db2b in ?? ()
>> #15 0xb7d6db2b in ?? ()
>> #16 0xb7d6db2b in ?? ()
>> #17 0xb7d6db2b in ?? ()
>> #18 0xb7d6db2b in ?? ()
>> #19 0xb7d6db2b in ?? ()
>> #20 0xb7d6db2b in ?? ()
>> #21 0xb7d6db2b in ?? ()
>> #22 0xb7d6db2b in ?? ()
>> #23 0xb7d6db2b in ?? ()
>> #24 0xb7d6db2b in ?? ()
>> #25 0xb7d6db2b in ?? ()
>> #26 0xb7d6db2b in ?? ()
>> #27 0xb7d6db2b in ?? ()
>> #28 0xb7d6db2b in ?? ()
>> #29 0xb7d6db2b in ?? ()
>> #30 0xb7d6db2b in ?? ()
>> #31 0xb7d6db2b in ?? ()
>> #32 0xb7d6db2b in ?? ()
>> #33 0xb7d6db2b in ?? ()
>> ---Type <return> to continue, or q <return> to quit---
>> #34 0xb7d6db2b in ?? ()
>> #35 0xb7d6db2b in ?? ()
>> #36 0xb7d6db2b in ?? ()
>> #37 0xb7d6db2b in ?? ()
>> #38 0xb7d6db2b in ?? ()
>> #39 0xb7d6db2b in ?? ()
>> #40 0xb7d6db2b in ?? ()
>> #41 0xb7d6db2b in ?? ()
>> #42 0xb7d6db2b in ?? ()
>> #43 0xb7d6db2b in ?? ()
>> #44 0xb7d6db2b in ?? ()
>> #45 0xb7d6db2b in ?? ()
>> #46 0xb7d6db2b in ?? ()
>> #47 0xb7d6db2b in ?? ()
>> #48 0xb7d6db2b in ?? ()
>> #49 0xb7d6db2b in ?? ()
>> #50 0xb7d6db2b in ?? ()
>> #51 0xb7d6db2b in ?? ()
>> #52 0xb7d6db2b in ?? ()
>> #53 0xb7d6db2b in ?? ()
>> #54 0xb7d6db2b in ?? ()
>> #55 0xb7d6db2b in ?? ()
>> #56 0xb7d6db2b in ?? ()
>> #57 0xb7d6db2b in ?? ()
>> #58 0xb7d6db2b in ?? ()
>> #59 0xb7d6db2b in ?? ()
>> #60 0xb7d6db2b in ?? ()
>> #61 0xb7d6db2b in ?? ()
>> #62 0xb7d6db2b in ?? ()
>> #63 0xb7d6db2b in ?? ()
>> #64 0xb7d6db2b in ?? ()
>> #65 0xb7d6db2b in ?? ()
>> #66 0xb7d6db2b in ?? ()
>> #67 0xb7d6db2b in ?? ()
>> ---Type <return> to continue, or q <return> to quit---
>> ... and so on
>>
>>> 2/ execute the command "break setrlimit", then "run" (say "yes" when it
>>> asks you if you want to start your program from the beginning).  It should
>>> stop right before calling setrlimit.  Paste the backtrace.
>> GNU gdb 6.8-debian
>> Copyright (C) 2008 Free Software Foundation, Inc.
>> License GPLv3+: GNU GPL version 3 or later
>> <http://gnu.org/licenses/gpl.html>
>> This is free software: you are free to change and redistribute it.
>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>> and "show warranty" for details.
>> This GDB was configured as "i486-linux-gnu".
>> (gdb) symbol-file hello
>> Reading symbols from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
>> (gdb) target remote DEVICE_IP:2345
>> Remote debugging using DEVLICE_IP:2345
>> 0xb7f9c910 in ?? ()
>> (gdb) break setrlimit
>> Function "setrlimit" not defined.
>> Make breakpoint pending on future shared library load? (y or [n]) y
>> Breakpoint 1 (setrlimit) pending.
>> (gdb) c
>> Continuing.
>>
>> Program received signal SIGSEGV, Segmentation fault.
>> 0xb7de6b0a in ?? ()
>>
>> :-( gdb does not stop at the breakpoint.
>>
>>
>>
>>> Please make sure that you have compiled Thrift for debugging.
>>> ("./configure CXXFLAGS='-O0 -g'").
>> I run another test in which I force the loading of a library:
>>
>> 1)
>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libz.so.1 echo hello
>> hello
>>
>> 2)
>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libnl.so.1 echo hello
>> hello
>>
>> 3)
>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libthrift.so.0 echo hello
>> Segmentation fault
>>
>>
>> ======
>>
>>
>> And here are some (relevant) outputs from the build:
>>
>>
>> CFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include "
>>
>> CXXFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include  -g"
>>
>> LDFLAGS="-L/home/siamak/seismo-openwrt/trunk/staging_dir/toolchain-i386_gcc4.1.2/lib
>> -L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/lib
>> -L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/lib " make -C
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/lib/cpp
>>
>> DESTDIR="/home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/ipkg-install"
>>
>>
>> AR=i386-linux-uclibc-ar AS="ccache i386-linux-uclibc-gcc -c -O2 -pipe
>> -march=i486 -funit-at-a-time -fhonour-copts" LD=i386-linux-uclibc-ld
>>
>> NM=i386-linux-uclibc-nm
>> CC="ccache i386-linux-uclibc-gcc"
>> GCC="ccache i386-linux-uclibc-gcc"
>> CXX="i386-linux-uclibc-g++"
>> RANLIB=i386-linux-uclibc-ranlib
>> STRIP=i386-linux-uclibc-strip
>> OBJCOPY=i386-linux-uclibc-objcopy
>> OBJDUMP=i386-linux-uclibc-objdump
>> SIZE=i386-linux-uclibc-size
>> CROSS="i386-linux-uclibc-"
>> ARCH="i386"
>>
>>
>> i386-linux-uclibc-g++ -DHAVE_CONFIG_H -I. -I. -I../.. -I./src
>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include -Wall -O0
>> -g -MT Monitor.lo -MD -MP -MF .deps/Monitor.Tpo -c
>> src/concurrency/Monitor.cpp  -fPIC -DPIC -o .libs/Monitor.o
>>
>>
>>> --David
>>>
>>> Siamak Haschemi wrote:
>>>> Hello again,
>>>>
>>>> the Hello world program without the thrift library linked shows this
>>>> strace (only the last relevant lines included):
>>>>
>>>>
>>>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>> ...}) = 0
>>>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>> ...}) = 0
>>>> brk(0)                                  = 0x88a7000
>>>> brk(0x88a8000)                          = 0x88a8000
>>>> write(1, "Hello World\n", 12Hello World
>>>> )           = 12
>>>> _exit(0)
>>>>
>>>>
>>>> For me, it looks like an problem with "getrlimit" or "setrlimit" function.
>>>>
>>>> Lind regards,
>>>>
>>>> Siamak Haschemi
>>>>
>>>> Siamak Haschemi schrieb:
>>>>> Hello again,
>>>>>
>>>>> I don't know if it helps, but here is some more information:
>>>>>
>>>>>
>>>>>
>>>>> root@OpenWrt:~# ldd ./hello
>>>>>         libthrift.so.0 => /lib/libthrift.so.0 (0xb7f23000)
>>>>>         libstdc++.so.6 => /lib/libstdc++.so.6 (0xb7e68000)
>>>>>         libm.so.0 => /lib/libm.so.0 (0xb7e5b000)
>>>>>         libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7e52000)
>>>>>         libc.so.0 => /lib/libc.so.0 (0xb7e08000)
>>>>>         librt.so.0 => /lib/librt.so.0 (0xb7e05000)
>>>>>         libpthread.so.0 => /lib/libpthread.so.0 (0xb7df3000)
>>>>>         ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb7fb9000)
>>>>>
>>>>>
>>>>>
>>>>> root@OpenWrt:~# strace ./hello
>>>>> execve("/bin/hello", ["/bin/hello"], [/* 8 vars */]) = 0
>>>>> mmap2(NULL, 20, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
>>>>> = 0xb7f52000
>>>>> stat("/etc/ld.so.cache", 0xbff56254)    = -1 ENOENT (No such file or
>>>>> directory)
>>>>> open("/lib/libthrift.so.0", O_RDONLY)   = 3
>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=604571, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20q\2\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 606208, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>> 0xb7ebd000
>>>>> mmap2(0xb7ebd000, 591833, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7ebd000
>>>>> mmap2(0xb7f4e000, 10651, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0x91) = 0xb7f4e000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0,\0\4\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 765952, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>> 0xb7e02000
>>>>> mmap2(0xb7e02000, 719316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7e02000
>>>>> mmap2(0xb7eb2000, 20473, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0xb0) = 0xb7eb2000
>>>>> mmap2(0xb7eb7000, 23828, PROT_READ|PROT_WRITE,
>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7eb7000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0t\21\0\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 53248, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7df5000
>>>>> mmap2(0xb7df5000, 41028, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7df5000
>>>>> mmap2(0xb7e00000, 4120, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0xa) = 0xb7e00000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0H\25\0\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 36864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7dec000
>>>>> mmap2(0xb7dec000, 31592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7dec000
>>>>> mmap2(0xb7df4000, 3302, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0x7) = 0xb7df4000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\251\0\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 303104, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>> 0xb7da2000
>>>>> mmap2(0xb7da2000, 271528, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7da2000
>>>>> mmap2(0xb7de5000, 5309, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0x42) = 0xb7de5000
>>>>> mmap2(0xb7de7000, 16988, PROT_READ|PROT_WRITE,
>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7de7000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/librt.so.0", O_RDONLY)       = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=4110, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\344\4\0\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 12288, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d9f000
>>>>> mmap2(0xb7d9f000, 2336, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7d9f000
>>>>> mmap2(0xb7da0000, 4110, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7da0000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/libpthread.so.0", O_RDONLY)  = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=58930, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0004=\0\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 73728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d8d000
>>>>> mmap2(0xb7d8d000, 37304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7d8d000
>>>>> mmap2(0xb7d97000, 22066, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0x9) = 0xb7d97000
>>>>> mmap2(0xb7d9d000, 6232, PROT_READ|PROT_WRITE,
>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7d9d000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> close(3)                                = 0
>>>>> stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=16390, ...}) = 0
>>>>> mprotect(0xb7eb2000, 16384, PROT_READ)  = 0
>>>>> mprotect(0xb7e00000, 4096, PROT_READ)   = 0
>>>>> mprotect(0xb7de5000, 4096, PROT_READ)   = 0
>>>>> mprotect(0xb7da0000, 4096, PROT_READ)   = 0
>>>>> mprotect(0xb7d97000, 4096, PROT_READ)   = 0
>>>>> mprotect(0xb7f57000, 4096, PROT_READ)   = 0
>>>>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>> ...}) = 0
>>>>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>> ...}) = 0
>>>>> getpid()                                = 2933
>>>>> getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
>>>>> setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=RLIM_INFINITY}) = 0
>>>>> rt_sigaction(SIGRTMIN, {0xb7d95f96, [], SA_RESTORER, 0xb7dac998}, NULL,
>>>>> 8) = 0
>>>>> rt_sigaction(SIGRT_1, {0xb7d95efe, [RTMIN], SA_RESTORER, 0xb7dac998},
>>>>> NULL, 8) = 0
>>>>> rt_sigaction(SIGRT_2, {0xb7d9562a, [], SA_RESTORER, 0xb7dac998}, NULL,
>>>>> 8) = 0
>>>>> rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
>>>>> rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 8) = 0
>>>>> --- SIGSEGV (Segmentation fault) @ 0 (0) ---
>>>>> +++ killed by SIGSEGV +++
>>>>>
>>>>>
>>>>>
>>>>> Kind regards,
>>>>>
>>>>> Siamak Haschemi
>>>>>
>>>>> Siamak Haschemi schrieb:
>>>>>> Hello,
>>>>>>
>>>>>> as you seen here (https://issues.apache.org/jira/browse/THRIFT-177), I
>>>>>> am trying to cross-compile Thrift for the OpenWRT platform
>>>>>> (http://openwrt.org/), which is a Linux distribution for embedded devices.
>>>>>>
>>>>>> After a two-night-fight, my result are the following:
>>>>>>
>>>>>> - I've created a OpenWRT package for thrift (see the attachment if you
>>>>>> are interested).
>>>>>> - I've successfully compiled the cpp-library (which results in
>>>>>> libthrift, libthriftz and libthriftnb)
>>>>>> - For now, I will not cross-compile the thrift-compiler since I will
>>>>>> compile the thrift definition files on my PC.
>>>>>>
>>>>>> Coming to this point, I was very happy and I thought that the story
>>>>>> ends, but now I am faced with a problem I cannot solve myself:
>>>>>>
>>>>>> For testing my cross-compilation result, I cross-compiled the cpp-part
>>>>>> of the thrift tutorial. I installed the cross-compiled libraries on the
>>>>>> target device and start the CppServer and the only reaction was
>>>>>> "Segmentation Fault" :-(
>>>>>>
>>>>>>
>>>>>> I tried to backtrack the problem and I came to the finding, that a
>>>>>> simple hello world program, which is linked to my cross-compiled
>>>>>> thrift-library, causes the "Segmentation Fault". Without linking the
>>>>>> thrift-library, everything is O.K.
>>>>>>
>>>>>>
>>>>>> =======================
>>>>>> ------------
>>>>>> Hello.cpp
>>>>>> ------------
>>>>>>
>>>>>> #include <iostream>
>>>>>>
>>>>>> using namespace std;
>>>>>>
>>>>>> int main(int argc, char **argv) {
>>>>>>   printf("Hello World!\n");
>>>>>>   return 0;
>>>>>> }
>>>>>>
>>>>>> 1) First try
>>>>>>
>>>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent *-lthrift* -o Hello Hello.cpp
>>>>>>
>>>>>> On the target device:
>>>>>>
>>>>>> root@OpenWrt:~# ./Hello
>>>>>> Segmentation fault
>>>>>>
>>>>>> 2) Second try
>>>>>>
>>>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent -o Hello Hello.cpp
>>>>>>
>>>>>> On the target device:
>>>>>>
>>>>>> root@OpenWrt:~# ./Hello
>>>>>> Hello World!
>>>>>>
>>>>>> ======================
>>>>>>
>>>>>> I will try to debug it with gdb, but I'm not an expert in this.
>>>>>>
>>>>>>
>>>>>> So, please, can someone help me?
>>>>>>
>>>>>>
>>>>>>
>>>>>> Kind regards,
>>>>>>
>>>>>> Siamak Haschemi
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>

Re: Use Thrift in the OpenWRT platform

Posted by David Reiss <dr...@facebook.com>.
I can't say for sure.  I wonder if maybe your cross-compilation environment
is different from the production environment in some way that was causing
the binary to not call pthread functions properly on startup.  Glad you got
it working!

--David

Siamak Haschemi wrote:
> Hello,
> 
> I hope I'm not disturbing anyone with my verboseness.
> 
> But I've done a major step: I added "-lpthread" to the linker options
> and the hello world example does not throw a "Segmentation Fault".
> 
> Well, I don't understand why this happens. Can someone please explain me
> this. Now I will try the tutorial.
> 
> 
> Kind regards,
> 
> Siamak Haschemi
> 
> Siamak Haschemi schrieb:
>> Hello again,
>>
>> now I have some results:
>>
>>> 1/ If you can run your program under gdb, please do so.  When it crashes,
>>> execute the "backtrace" command.  Paste the results.
>> Type "help" followed by a class name for a list of commands in that class.
>> Type "help all" for the list of all commands.
>> Type "help" followed by command name for full documentation.
>> Type "apropos word" to search for commands related to "word".
>> Command name abbreviations are allowed if unambiguous.
>> (gdb) help breakpoints
>> Making program stop at certain points.
>>
>> List of commands:
>>
>> awatch -- Set a watchpoint for an expression
>> break -- Set breakpoint at specified line or function
>> catch -- Set catchpoints to catch events
>> clear -- Clear breakpoint at specified line or function
>> commands -- Set commands to be executed when a breakpoint is hit
>> condition -- Specify breakpoint number N to break only if COND is true
>> delete -- Delete some breakpoints or auto-display expressions
>> delete breakpoints -- Delete some breakpoints or auto-display expressions
>> delete checkpoint -- Delete a fork/checkpoint (experimental)
>> delete display -- Cancel some expressions to be displayed when program stops
>> delete mem -- Delete memory region
>> delete tracepoints -- Delete specified tracepoints
>> disable -- Disable some breakpoints
>> disable breakpoints -- Disable some breakpoints
>> disable display -- Disable some expressions to be displayed when program
>> stops
>> disable mem -- Disable memory region
>> disable tracepoints -- Disable specified tracepoints
>> enable -- Enable some breakpoints
>> enable delete -- Enable breakpoints and delete when hit
>> enable display -- Enable some expressions to be displayed when program stops
>> enable mem -- Enable memory region
>> enable once -- Enable breakpoints for one hit
>> enable tracepoints -- Enable specified tracepoints
>> hbreak -- Set a hardware assisted  breakpoint
>> ignore -- Set ignore-count of breakpoint number N to COUNT
>> rbreak -- Set a breakpoint for all functions matching REGEXP
>> rwatch -- Set a read watchpoint for an expression
>> tbreak -- Set a temporary breakpoint
>> tcatch -- Set temporary catchpoints to catch events
>> thbreak -- Set a temporary hardware assisted breakpoint
>> watch -- Set a watchpoint for an expression
>>
>> Type "help" followed by command name for full documentation.
>> Type "apropos word" to search for commands related to "word".
>> Command name abbreviations are allowed if unambiguous.
>> (gdb) breakpoints clear
>> Undefined command: "breakpoints".  Try "help".
>> (gdb) break clear
>> Function "clear" not defined.
>> Make breakpoint pending on future shared library load? (y or [n]) n
>> (gdb) quit
>> siamak@siamak-desktop:~/seismo-openwrt/trunk/build_dir/i386/root-x86$ gdb
>> GNU gdb 6.8-debian
>> Copyright (C) 2008 Free Software Foundation, Inc.
>> License GPLv3+: GNU GPL version 3 or later
>> <http://gnu.org/licenses/gpl.html>
>> This is free software: you are free to change and redistribute it.
>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>> and "show warranty" for details.
>> This GDB was configured as "i486-linux-gnu".
>> (gdb) >> 1/ If you can run your program under gdb, please do so.  When
>> it crashes,
>> Undefined command: ">>".  Try "help".
>> (gdb) >> execute the "backtrace" command.  Paste the results.Quit
>> (gdb) quit
>> siamak@siamak-desktop:~/seismo-openwrt/trunk/build_dir/i386/root-x86$ gdb
>> GNU gdb 6.8-debian
>> Copyright (C) 2008 Free Software Foundation, Inc.
>> License GPLv3+: GNU GPL version 3 or later
>> <http://gnu.org/licenses/gpl.html>
>> This is free software: you are free to change and redistribute it.
>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>> and "show warranty" for details.
>> This GDB was configured as "i486-linux-gnu".
>> (gdb) set solib-absolute-prefix
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86
>> (gdb) file bin/hello
>> Reading symbols from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/bin/hello...done.
>> (gdb) target remote 141.20.23.212:2345
>> Remote debugging using 141.20.23.212:2345
>> 0xb7f6e910 in _start () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
>> (gdb) continue
>> Continuing.
>>
>> Program received signal SIGSEGV, Segmentation fault.
>> 0xb7dafb0a in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> (gdb) bt
>> #0  0xb7dafb0a in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #1  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #2  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #3  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #4  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #5  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #6  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #7  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #8  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #9  0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #10 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #11 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #12 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #13 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #14 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #15 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #16 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #17 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #18 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #19 0xb7dafb2b in _pthread_cleanup_push_defer ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> ---Type <return> to continue, or q <return> to quit---
>>
>>> 2/ execute the command "break setrlimit", then "run" (say "yes" when it
>>> asks you if you want to start your program from the beginning).  It should
>>> stop right before calling setrlimit.  Paste the backtrace
>> Breakpoint 1, 0xb7db5aa5 in setrlimit ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> (gdb) bt
>> #0  0xb7db5aa5 in setrlimit () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
>> #1  0xb7d9bb22 in ?? () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
>> #2  0xb7d9c137 in ?? () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
>> #3  0xb7d966c1 in ?? () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
>> #4  0xb7fa73f0 in _dl_get_ready_to_run ()
>>    from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
>> #5  0xb7fa76ea in ?? () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
>> #6  0xb7fa4915 in _start () from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
>>
>>
>>
>> Kind regards,
>>
>> Siamak
>>
>> Siamak Haschemi schrieb:
>>> Hello David,
>>>
>>> thank you for helping me!
>>>
>>> I have troubles in setting breakpoints. I'm forced to use gdbserver with
>>> gdb. I replaced the real IP with DEVICE_IP in this E-Mail.
>>>
>>> See my comments below.
>>>
>>> David Reiss schrieb:
>>>> Can you please report the following...
>>>>
>>>> 1/ If you can run your program under gdb, please do so.  When it crashes,
>>>> execute the "backtrace" command.  Paste the results.
>>> GNU gdb 6.8-debian
>>> Copyright (C) 2008 Free Software Foundation, Inc.
>>> License GPLv3+: GNU GPL version 3 or later
>>> <http://gnu.org/licenses/gpl.html>
>>> This is free software: you are free to change and redistribute it.
>>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>>> and "show warranty" for details.
>>> This GDB was configured as "i486-linux-gnu".
>>> (gdb) symbol-file hello
>>> Reading symbols from
>>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
>>> (gdb) target remote DEVICE_IP:2345
>>> Remote debugging using DEVICE_IP:2345
>>> 0xb7f23910 in ?? ()
>>> (gdb) continue
>>> Continuing.
>>>
>>> Program received signal SIGSEGV, Segmentation fault.
>>> 0xb7d6db0a in ?? ()
>>> (gdb) backtrace
>>> #0  0xb7d6db0a in ?? ()
>>> #1  0xb7d6db2b in ?? ()
>>> #2  0xb7d6db2b in ?? ()
>>> #3  0xb7d6db2b in ?? ()
>>> #4  0xb7d6db2b in ?? ()
>>> #5  0xb7d6db2b in ?? ()
>>> #6  0xb7d6db2b in ?? ()
>>> #7  0xb7d6db2b in ?? ()
>>> #8  0xb7d6db2b in ?? ()
>>> #9  0xb7d6db2b in ?? ()
>>> #10 0xb7d6db2b in ?? ()
>>> #11 0xb7d6db2b in ?? ()
>>> #12 0xb7d6db2b in ?? ()
>>> #13 0xb7d6db2b in ?? ()
>>> #14 0xb7d6db2b in ?? ()
>>> #15 0xb7d6db2b in ?? ()
>>> #16 0xb7d6db2b in ?? ()
>>> #17 0xb7d6db2b in ?? ()
>>> #18 0xb7d6db2b in ?? ()
>>> #19 0xb7d6db2b in ?? ()
>>> #20 0xb7d6db2b in ?? ()
>>> #21 0xb7d6db2b in ?? ()
>>> #22 0xb7d6db2b in ?? ()
>>> #23 0xb7d6db2b in ?? ()
>>> #24 0xb7d6db2b in ?? ()
>>> #25 0xb7d6db2b in ?? ()
>>> #26 0xb7d6db2b in ?? ()
>>> #27 0xb7d6db2b in ?? ()
>>> #28 0xb7d6db2b in ?? ()
>>> #29 0xb7d6db2b in ?? ()
>>> #30 0xb7d6db2b in ?? ()
>>> #31 0xb7d6db2b in ?? ()
>>> #32 0xb7d6db2b in ?? ()
>>> #33 0xb7d6db2b in ?? ()
>>> ---Type <return> to continue, or q <return> to quit---
>>> #34 0xb7d6db2b in ?? ()
>>> #35 0xb7d6db2b in ?? ()
>>> #36 0xb7d6db2b in ?? ()
>>> #37 0xb7d6db2b in ?? ()
>>> #38 0xb7d6db2b in ?? ()
>>> #39 0xb7d6db2b in ?? ()
>>> #40 0xb7d6db2b in ?? ()
>>> #41 0xb7d6db2b in ?? ()
>>> #42 0xb7d6db2b in ?? ()
>>> #43 0xb7d6db2b in ?? ()
>>> #44 0xb7d6db2b in ?? ()
>>> #45 0xb7d6db2b in ?? ()
>>> #46 0xb7d6db2b in ?? ()
>>> #47 0xb7d6db2b in ?? ()
>>> #48 0xb7d6db2b in ?? ()
>>> #49 0xb7d6db2b in ?? ()
>>> #50 0xb7d6db2b in ?? ()
>>> #51 0xb7d6db2b in ?? ()
>>> #52 0xb7d6db2b in ?? ()
>>> #53 0xb7d6db2b in ?? ()
>>> #54 0xb7d6db2b in ?? ()
>>> #55 0xb7d6db2b in ?? ()
>>> #56 0xb7d6db2b in ?? ()
>>> #57 0xb7d6db2b in ?? ()
>>> #58 0xb7d6db2b in ?? ()
>>> #59 0xb7d6db2b in ?? ()
>>> #60 0xb7d6db2b in ?? ()
>>> #61 0xb7d6db2b in ?? ()
>>> #62 0xb7d6db2b in ?? ()
>>> #63 0xb7d6db2b in ?? ()
>>> #64 0xb7d6db2b in ?? ()
>>> #65 0xb7d6db2b in ?? ()
>>> #66 0xb7d6db2b in ?? ()
>>> #67 0xb7d6db2b in ?? ()
>>> ---Type <return> to continue, or q <return> to quit---
>>> ... and so on
>>>
>>>> 2/ execute the command "break setrlimit", then "run" (say "yes" when it
>>>> asks you if you want to start your program from the beginning).  It should
>>>> stop right before calling setrlimit.  Paste the backtrace.
>>> GNU gdb 6.8-debian
>>> Copyright (C) 2008 Free Software Foundation, Inc.
>>> License GPLv3+: GNU GPL version 3 or later
>>> <http://gnu.org/licenses/gpl.html>
>>> This is free software: you are free to change and redistribute it.
>>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>>> and "show warranty" for details.
>>> This GDB was configured as "i486-linux-gnu".
>>> (gdb) symbol-file hello
>>> Reading symbols from
>>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
>>> (gdb) target remote DEVICE_IP:2345
>>> Remote debugging using DEVLICE_IP:2345
>>> 0xb7f9c910 in ?? ()
>>> (gdb) break setrlimit
>>> Function "setrlimit" not defined.
>>> Make breakpoint pending on future shared library load? (y or [n]) y
>>> Breakpoint 1 (setrlimit) pending.
>>> (gdb) c
>>> Continuing.
>>>
>>> Program received signal SIGSEGV, Segmentation fault.
>>> 0xb7de6b0a in ?? ()
>>>
>>> :-( gdb does not stop at the breakpoint.
>>>
>>>
>>>
>>>> Please make sure that you have compiled Thrift for debugging.
>>>> ("./configure CXXFLAGS='-O0 -g'").
>>> I run another test in which I force the loading of a library:
>>>
>>> 1)
>>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libz.so.1 echo hello
>>> hello
>>>
>>> 2)
>>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libnl.so.1 echo hello
>>> hello
>>>
>>> 3)
>>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libthrift.so.0 echo hello
>>> Segmentation fault
>>>
>>>
>>> ======
>>>
>>>
>>> And here are some (relevant) outputs from the build:
>>>
>>>
>>> CFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include "
>>>
>>> CXXFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include  -g"
>>>
>>> LDFLAGS="-L/home/siamak/seismo-openwrt/trunk/staging_dir/toolchain-i386_gcc4.1.2/lib
>>> -L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/lib
>>> -L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/lib " make -C
>>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/lib/cpp
>>>
>>> DESTDIR="/home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/ipkg-install"
>>>
>>>
>>> AR=i386-linux-uclibc-ar AS="ccache i386-linux-uclibc-gcc -c -O2 -pipe
>>> -march=i486 -funit-at-a-time -fhonour-copts" LD=i386-linux-uclibc-ld
>>>
>>> NM=i386-linux-uclibc-nm
>>> CC="ccache i386-linux-uclibc-gcc"
>>> GCC="ccache i386-linux-uclibc-gcc"
>>> CXX="i386-linux-uclibc-g++"
>>> RANLIB=i386-linux-uclibc-ranlib
>>> STRIP=i386-linux-uclibc-strip
>>> OBJCOPY=i386-linux-uclibc-objcopy
>>> OBJDUMP=i386-linux-uclibc-objdump
>>> SIZE=i386-linux-uclibc-size
>>> CROSS="i386-linux-uclibc-"
>>> ARCH="i386"
>>>
>>>
>>> i386-linux-uclibc-g++ -DHAVE_CONFIG_H -I. -I. -I../.. -I./src
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include -Wall -O0
>>> -g -MT Monitor.lo -MD -MP -MF .deps/Monitor.Tpo -c
>>> src/concurrency/Monitor.cpp  -fPIC -DPIC -o .libs/Monitor.o
>>>
>>>
>>>> --David
>>>>
>>>> Siamak Haschemi wrote:
>>>>> Hello again,
>>>>>
>>>>> the Hello world program without the thrift library linked shows this
>>>>> strace (only the last relevant lines included):
>>>>>
>>>>>
>>>>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>> ...}) = 0
>>>>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>> ...}) = 0
>>>>> brk(0)                                  = 0x88a7000
>>>>> brk(0x88a8000)                          = 0x88a8000
>>>>> write(1, "Hello World\n", 12Hello World
>>>>> )           = 12
>>>>> _exit(0)
>>>>>
>>>>>
>>>>> For me, it looks like an problem with "getrlimit" or "setrlimit" function.
>>>>>
>>>>> Lind regards,
>>>>>
>>>>> Siamak Haschemi
>>>>>
>>>>> Siamak Haschemi schrieb:
>>>>>> Hello again,
>>>>>>
>>>>>> I don't know if it helps, but here is some more information:
>>>>>>
>>>>>>
>>>>>>
>>>>>> root@OpenWrt:~# ldd ./hello
>>>>>>         libthrift.so.0 => /lib/libthrift.so.0 (0xb7f23000)
>>>>>>         libstdc++.so.6 => /lib/libstdc++.so.6 (0xb7e68000)
>>>>>>         libm.so.0 => /lib/libm.so.0 (0xb7e5b000)
>>>>>>         libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7e52000)
>>>>>>         libc.so.0 => /lib/libc.so.0 (0xb7e08000)
>>>>>>         librt.so.0 => /lib/librt.so.0 (0xb7e05000)
>>>>>>         libpthread.so.0 => /lib/libpthread.so.0 (0xb7df3000)
>>>>>>         ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb7fb9000)
>>>>>>
>>>>>>
>>>>>>
>>>>>> root@OpenWrt:~# strace ./hello
>>>>>> execve("/bin/hello", ["/bin/hello"], [/* 8 vars */]) = 0
>>>>>> mmap2(NULL, 20, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
>>>>>> = 0xb7f52000
>>>>>> stat("/etc/ld.so.cache", 0xbff56254)    = -1 ENOENT (No such file or
>>>>>> directory)
>>>>>> open("/lib/libthrift.so.0", O_RDONLY)   = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=604571, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20q\2\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 606208, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>>> 0xb7ebd000
>>>>>> mmap2(0xb7ebd000, 591833, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7ebd000
>>>>>> mmap2(0xb7f4e000, 10651, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0x91) = 0xb7f4e000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0,\0\4\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 765952, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>>> 0xb7e02000
>>>>>> mmap2(0xb7e02000, 719316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7e02000
>>>>>> mmap2(0xb7eb2000, 20473, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0xb0) = 0xb7eb2000
>>>>>> mmap2(0xb7eb7000, 23828, PROT_READ|PROT_WRITE,
>>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7eb7000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0t\21\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 53248, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7df5000
>>>>>> mmap2(0xb7df5000, 41028, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7df5000
>>>>>> mmap2(0xb7e00000, 4120, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0xa) = 0xb7e00000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0H\25\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 36864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7dec000
>>>>>> mmap2(0xb7dec000, 31592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7dec000
>>>>>> mmap2(0xb7df4000, 3302, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0x7) = 0xb7df4000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\251\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 303104, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>>> 0xb7da2000
>>>>>> mmap2(0xb7da2000, 271528, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7da2000
>>>>>> mmap2(0xb7de5000, 5309, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0x42) = 0xb7de5000
>>>>>> mmap2(0xb7de7000, 16988, PROT_READ|PROT_WRITE,
>>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7de7000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/librt.so.0", O_RDONLY)       = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=4110, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\344\4\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 12288, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d9f000
>>>>>> mmap2(0xb7d9f000, 2336, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7d9f000
>>>>>> mmap2(0xb7da0000, 4110, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7da0000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libpthread.so.0", O_RDONLY)  = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=58930, ...}) = 0
>>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>>> 0) = 0xb7f51000
>>>>>> read(3,
>>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0004=\0\0004\0\0\0"...,
>>>>>> 4096) = 4096
>>>>>> mmap2(NULL, 73728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d8d000
>>>>>> mmap2(0xb7d8d000, 37304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0) = 0xb7d8d000
>>>>>> mmap2(0xb7d97000, 22066, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>>> 0x9) = 0xb7d97000
>>>>>> mmap2(0xb7d9d000, 6232, PROT_READ|PROT_WRITE,
>>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7d9d000
>>>>>> close(3)                                = 0
>>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>>> close(3)                                = 0
>>>>>> stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=16390, ...}) = 0
>>>>>> mprotect(0xb7eb2000, 16384, PROT_READ)  = 0
>>>>>> mprotect(0xb7e00000, 4096, PROT_READ)   = 0
>>>>>> mprotect(0xb7de5000, 4096, PROT_READ)   = 0
>>>>>> mprotect(0xb7da0000, 4096, PROT_READ)   = 0
>>>>>> mprotect(0xb7d97000, 4096, PROT_READ)   = 0
>>>>>> mprotect(0xb7f57000, 4096, PROT_READ)   = 0
>>>>>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>>> ...}) = 0
>>>>>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>>> ...}) = 0
>>>>>> getpid()                                = 2933
>>>>>> getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
>>>>>> setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=RLIM_INFINITY}) = 0
>>>>>> rt_sigaction(SIGRTMIN, {0xb7d95f96, [], SA_RESTORER, 0xb7dac998}, NULL,
>>>>>> 8) = 0
>>>>>> rt_sigaction(SIGRT_1, {0xb7d95efe, [RTMIN], SA_RESTORER, 0xb7dac998},
>>>>>> NULL, 8) = 0
>>>>>> rt_sigaction(SIGRT_2, {0xb7d9562a, [], SA_RESTORER, 0xb7dac998}, NULL,
>>>>>> 8) = 0
>>>>>> rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
>>>>>> rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 8) = 0
>>>>>> --- SIGSEGV (Segmentation fault) @ 0 (0) ---
>>>>>> +++ killed by SIGSEGV +++
>>>>>>
>>>>>>
>>>>>>
>>>>>> Kind regards,
>>>>>>
>>>>>> Siamak Haschemi
>>>>>>
>>>>>> Siamak Haschemi schrieb:
>>>>>>> Hello,
>>>>>>>
>>>>>>> as you seen here (https://issues.apache.org/jira/browse/THRIFT-177), I
>>>>>>> am trying to cross-compile Thrift for the OpenWRT platform
>>>>>>> (http://openwrt.org/), which is a Linux distribution for embedded devices.
>>>>>>>
>>>>>>> After a two-night-fight, my result are the following:
>>>>>>>
>>>>>>> - I've created a OpenWRT package for thrift (see the attachment if you
>>>>>>> are interested).
>>>>>>> - I've successfully compiled the cpp-library (which results in
>>>>>>> libthrift, libthriftz and libthriftnb)
>>>>>>> - For now, I will not cross-compile the thrift-compiler since I will
>>>>>>> compile the thrift definition files on my PC.
>>>>>>>
>>>>>>> Coming to this point, I was very happy and I thought that the story
>>>>>>> ends, but now I am faced with a problem I cannot solve myself:
>>>>>>>
>>>>>>> For testing my cross-compilation result, I cross-compiled the cpp-part
>>>>>>> of the thrift tutorial. I installed the cross-compiled libraries on the
>>>>>>> target device and start the CppServer and the only reaction was
>>>>>>> "Segmentation Fault" :-(
>>>>>>>
>>>>>>>
>>>>>>> I tried to backtrack the problem and I came to the finding, that a
>>>>>>> simple hello world program, which is linked to my cross-compiled
>>>>>>> thrift-library, causes the "Segmentation Fault". Without linking the
>>>>>>> thrift-library, everything is O.K.
>>>>>>>
>>>>>>>
>>>>>>> =======================
>>>>>>> ------------
>>>>>>> Hello.cpp
>>>>>>> ------------
>>>>>>>
>>>>>>> #include <iostream>
>>>>>>>
>>>>>>> using namespace std;
>>>>>>>
>>>>>>> int main(int argc, char **argv) {
>>>>>>>   printf("Hello World!\n");
>>>>>>>   return 0;
>>>>>>> }
>>>>>>>
>>>>>>> 1) First try
>>>>>>>
>>>>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent *-lthrift* -o Hello Hello.cpp
>>>>>>>
>>>>>>> On the target device:
>>>>>>>
>>>>>>> root@OpenWrt:~# ./Hello
>>>>>>> Segmentation fault
>>>>>>>
>>>>>>> 2) Second try
>>>>>>>
>>>>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent -o Hello Hello.cpp
>>>>>>>
>>>>>>> On the target device:
>>>>>>>
>>>>>>> root@OpenWrt:~# ./Hello
>>>>>>> Hello World!
>>>>>>>
>>>>>>> ======================
>>>>>>>
>>>>>>> I will try to debug it with gdb, but I'm not an expert in this.
>>>>>>>
>>>>>>>
>>>>>>> So, please, can someone help me?
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Kind regards,
>>>>>>>
>>>>>>> Siamak Haschemi
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>


Re: Use Thrift in the OpenWRT platform

Posted by Siamak Haschemi <ha...@informatik.hu-berlin.de>.
Hello,

I hope I'm not disturbing anyone with my verboseness.

But I've done a major step: I added "-lpthread" to the linker options
and the hello world example does not throw a "Segmentation Fault".

Well, I don't understand why this happens. Can someone please explain me
this. Now I will try the tutorial.


Kind regards,

Siamak Haschemi

Siamak Haschemi schrieb:
> Hello again,
> 
> now I have some results:
> 
>> 1/ If you can run your program under gdb, please do so.  When it crashes,
>> execute the "backtrace" command.  Paste the results.
> 
> Type "help" followed by a class name for a list of commands in that class.
> Type "help all" for the list of all commands.
> Type "help" followed by command name for full documentation.
> Type "apropos word" to search for commands related to "word".
> Command name abbreviations are allowed if unambiguous.
> (gdb) help breakpoints
> Making program stop at certain points.
> 
> List of commands:
> 
> awatch -- Set a watchpoint for an expression
> break -- Set breakpoint at specified line or function
> catch -- Set catchpoints to catch events
> clear -- Clear breakpoint at specified line or function
> commands -- Set commands to be executed when a breakpoint is hit
> condition -- Specify breakpoint number N to break only if COND is true
> delete -- Delete some breakpoints or auto-display expressions
> delete breakpoints -- Delete some breakpoints or auto-display expressions
> delete checkpoint -- Delete a fork/checkpoint (experimental)
> delete display -- Cancel some expressions to be displayed when program stops
> delete mem -- Delete memory region
> delete tracepoints -- Delete specified tracepoints
> disable -- Disable some breakpoints
> disable breakpoints -- Disable some breakpoints
> disable display -- Disable some expressions to be displayed when program
> stops
> disable mem -- Disable memory region
> disable tracepoints -- Disable specified tracepoints
> enable -- Enable some breakpoints
> enable delete -- Enable breakpoints and delete when hit
> enable display -- Enable some expressions to be displayed when program stops
> enable mem -- Enable memory region
> enable once -- Enable breakpoints for one hit
> enable tracepoints -- Enable specified tracepoints
> hbreak -- Set a hardware assisted  breakpoint
> ignore -- Set ignore-count of breakpoint number N to COUNT
> rbreak -- Set a breakpoint for all functions matching REGEXP
> rwatch -- Set a read watchpoint for an expression
> tbreak -- Set a temporary breakpoint
> tcatch -- Set temporary catchpoints to catch events
> thbreak -- Set a temporary hardware assisted breakpoint
> watch -- Set a watchpoint for an expression
> 
> Type "help" followed by command name for full documentation.
> Type "apropos word" to search for commands related to "word".
> Command name abbreviations are allowed if unambiguous.
> (gdb) breakpoints clear
> Undefined command: "breakpoints".  Try "help".
> (gdb) break clear
> Function "clear" not defined.
> Make breakpoint pending on future shared library load? (y or [n]) n
> (gdb) quit
> siamak@siamak-desktop:~/seismo-openwrt/trunk/build_dir/i386/root-x86$ gdb
> GNU gdb 6.8-debian
> Copyright (C) 2008 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later
> <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "i486-linux-gnu".
> (gdb) >> 1/ If you can run your program under gdb, please do so.  When
> it crashes,
> Undefined command: ">>".  Try "help".
> (gdb) >> execute the "backtrace" command.  Paste the results.Quit
> (gdb) quit
> siamak@siamak-desktop:~/seismo-openwrt/trunk/build_dir/i386/root-x86$ gdb
> GNU gdb 6.8-debian
> Copyright (C) 2008 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later
> <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "i486-linux-gnu".
> (gdb) set solib-absolute-prefix
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86
> (gdb) file bin/hello
> Reading symbols from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/bin/hello...done.
> (gdb) target remote 141.20.23.212:2345
> Remote debugging using 141.20.23.212:2345
> 0xb7f6e910 in _start () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
> (gdb) continue
> Continuing.
> 
> Program received signal SIGSEGV, Segmentation fault.
> 0xb7dafb0a in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> (gdb) bt
> #0  0xb7dafb0a in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #1  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #2  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #3  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #4  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #5  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #6  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #7  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #8  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #9  0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #10 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #11 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #12 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #13 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #14 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #15 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #16 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #17 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #18 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #19 0xb7dafb2b in _pthread_cleanup_push_defer ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> ---Type <return> to continue, or q <return> to quit---
> 
>> 2/ execute the command "break setrlimit", then "run" (say "yes" when it
>> asks you if you want to start your program from the beginning).  It should
>> stop right before calling setrlimit.  Paste the backtrace
> 
> Breakpoint 1, 0xb7db5aa5 in setrlimit ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> (gdb) bt
> #0  0xb7db5aa5 in setrlimit () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
> #1  0xb7d9bb22 in ?? () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
> #2  0xb7d9c137 in ?? () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
> #3  0xb7d966c1 in ?? () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
> #4  0xb7fa73f0 in _dl_get_ready_to_run ()
>    from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
> #5  0xb7fa76ea in ?? () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
> #6  0xb7fa4915 in _start () from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
> 
> 
> 
> Kind regards,
> 
> Siamak
> 
> Siamak Haschemi schrieb:
>> Hello David,
>>
>> thank you for helping me!
>>
>> I have troubles in setting breakpoints. I'm forced to use gdbserver with
>> gdb. I replaced the real IP with DEVICE_IP in this E-Mail.
>>
>> See my comments below.
>>
>> David Reiss schrieb:
>>> Can you please report the following...
>>>
>>> 1/ If you can run your program under gdb, please do so.  When it crashes,
>>> execute the "backtrace" command.  Paste the results.
>> GNU gdb 6.8-debian
>> Copyright (C) 2008 Free Software Foundation, Inc.
>> License GPLv3+: GNU GPL version 3 or later
>> <http://gnu.org/licenses/gpl.html>
>> This is free software: you are free to change and redistribute it.
>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>> and "show warranty" for details.
>> This GDB was configured as "i486-linux-gnu".
>> (gdb) symbol-file hello
>> Reading symbols from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
>> (gdb) target remote DEVICE_IP:2345
>> Remote debugging using DEVICE_IP:2345
>> 0xb7f23910 in ?? ()
>> (gdb) continue
>> Continuing.
>>
>> Program received signal SIGSEGV, Segmentation fault.
>> 0xb7d6db0a in ?? ()
>> (gdb) backtrace
>> #0  0xb7d6db0a in ?? ()
>> #1  0xb7d6db2b in ?? ()
>> #2  0xb7d6db2b in ?? ()
>> #3  0xb7d6db2b in ?? ()
>> #4  0xb7d6db2b in ?? ()
>> #5  0xb7d6db2b in ?? ()
>> #6  0xb7d6db2b in ?? ()
>> #7  0xb7d6db2b in ?? ()
>> #8  0xb7d6db2b in ?? ()
>> #9  0xb7d6db2b in ?? ()
>> #10 0xb7d6db2b in ?? ()
>> #11 0xb7d6db2b in ?? ()
>> #12 0xb7d6db2b in ?? ()
>> #13 0xb7d6db2b in ?? ()
>> #14 0xb7d6db2b in ?? ()
>> #15 0xb7d6db2b in ?? ()
>> #16 0xb7d6db2b in ?? ()
>> #17 0xb7d6db2b in ?? ()
>> #18 0xb7d6db2b in ?? ()
>> #19 0xb7d6db2b in ?? ()
>> #20 0xb7d6db2b in ?? ()
>> #21 0xb7d6db2b in ?? ()
>> #22 0xb7d6db2b in ?? ()
>> #23 0xb7d6db2b in ?? ()
>> #24 0xb7d6db2b in ?? ()
>> #25 0xb7d6db2b in ?? ()
>> #26 0xb7d6db2b in ?? ()
>> #27 0xb7d6db2b in ?? ()
>> #28 0xb7d6db2b in ?? ()
>> #29 0xb7d6db2b in ?? ()
>> #30 0xb7d6db2b in ?? ()
>> #31 0xb7d6db2b in ?? ()
>> #32 0xb7d6db2b in ?? ()
>> #33 0xb7d6db2b in ?? ()
>> ---Type <return> to continue, or q <return> to quit---
>> #34 0xb7d6db2b in ?? ()
>> #35 0xb7d6db2b in ?? ()
>> #36 0xb7d6db2b in ?? ()
>> #37 0xb7d6db2b in ?? ()
>> #38 0xb7d6db2b in ?? ()
>> #39 0xb7d6db2b in ?? ()
>> #40 0xb7d6db2b in ?? ()
>> #41 0xb7d6db2b in ?? ()
>> #42 0xb7d6db2b in ?? ()
>> #43 0xb7d6db2b in ?? ()
>> #44 0xb7d6db2b in ?? ()
>> #45 0xb7d6db2b in ?? ()
>> #46 0xb7d6db2b in ?? ()
>> #47 0xb7d6db2b in ?? ()
>> #48 0xb7d6db2b in ?? ()
>> #49 0xb7d6db2b in ?? ()
>> #50 0xb7d6db2b in ?? ()
>> #51 0xb7d6db2b in ?? ()
>> #52 0xb7d6db2b in ?? ()
>> #53 0xb7d6db2b in ?? ()
>> #54 0xb7d6db2b in ?? ()
>> #55 0xb7d6db2b in ?? ()
>> #56 0xb7d6db2b in ?? ()
>> #57 0xb7d6db2b in ?? ()
>> #58 0xb7d6db2b in ?? ()
>> #59 0xb7d6db2b in ?? ()
>> #60 0xb7d6db2b in ?? ()
>> #61 0xb7d6db2b in ?? ()
>> #62 0xb7d6db2b in ?? ()
>> #63 0xb7d6db2b in ?? ()
>> #64 0xb7d6db2b in ?? ()
>> #65 0xb7d6db2b in ?? ()
>> #66 0xb7d6db2b in ?? ()
>> #67 0xb7d6db2b in ?? ()
>> ---Type <return> to continue, or q <return> to quit---
>> ... and so on
>>
>>> 2/ execute the command "break setrlimit", then "run" (say "yes" when it
>>> asks you if you want to start your program from the beginning).  It should
>>> stop right before calling setrlimit.  Paste the backtrace.
>> GNU gdb 6.8-debian
>> Copyright (C) 2008 Free Software Foundation, Inc.
>> License GPLv3+: GNU GPL version 3 or later
>> <http://gnu.org/licenses/gpl.html>
>> This is free software: you are free to change and redistribute it.
>> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>> and "show warranty" for details.
>> This GDB was configured as "i486-linux-gnu".
>> (gdb) symbol-file hello
>> Reading symbols from
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
>> (gdb) target remote DEVICE_IP:2345
>> Remote debugging using DEVLICE_IP:2345
>> 0xb7f9c910 in ?? ()
>> (gdb) break setrlimit
>> Function "setrlimit" not defined.
>> Make breakpoint pending on future shared library load? (y or [n]) y
>> Breakpoint 1 (setrlimit) pending.
>> (gdb) c
>> Continuing.
>>
>> Program received signal SIGSEGV, Segmentation fault.
>> 0xb7de6b0a in ?? ()
>>
>> :-( gdb does not stop at the breakpoint.
>>
>>
>>
>>> Please make sure that you have compiled Thrift for debugging.
>>> ("./configure CXXFLAGS='-O0 -g'").
>> I run another test in which I force the loading of a library:
>>
>> 1)
>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libz.so.1 echo hello
>> hello
>>
>> 2)
>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libnl.so.1 echo hello
>> hello
>>
>> 3)
>> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libthrift.so.0 echo hello
>> Segmentation fault
>>
>>
>> ======
>>
>>
>> And here are some (relevant) outputs from the build:
>>
>>
>> CFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include "
>>
>> CXXFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include  -g"
>>
>> LDFLAGS="-L/home/siamak/seismo-openwrt/trunk/staging_dir/toolchain-i386_gcc4.1.2/lib
>> -L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/lib
>> -L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/lib " make -C
>> /home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/lib/cpp
>>
>> DESTDIR="/home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/ipkg-install"
>>
>>
>> AR=i386-linux-uclibc-ar AS="ccache i386-linux-uclibc-gcc -c -O2 -pipe
>> -march=i486 -funit-at-a-time -fhonour-copts" LD=i386-linux-uclibc-ld
>>
>> NM=i386-linux-uclibc-nm
>> CC="ccache i386-linux-uclibc-gcc"
>> GCC="ccache i386-linux-uclibc-gcc"
>> CXX="i386-linux-uclibc-g++"
>> RANLIB=i386-linux-uclibc-ranlib
>> STRIP=i386-linux-uclibc-strip
>> OBJCOPY=i386-linux-uclibc-objcopy
>> OBJDUMP=i386-linux-uclibc-objdump
>> SIZE=i386-linux-uclibc-size
>> CROSS="i386-linux-uclibc-"
>> ARCH="i386"
>>
>>
>> i386-linux-uclibc-g++ -DHAVE_CONFIG_H -I. -I. -I../.. -I./src
>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
>> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include -Wall -O0
>> -g -MT Monitor.lo -MD -MP -MF .deps/Monitor.Tpo -c
>> src/concurrency/Monitor.cpp  -fPIC -DPIC -o .libs/Monitor.o
>>
>>
>>> --David
>>>
>>> Siamak Haschemi wrote:
>>>> Hello again,
>>>>
>>>> the Hello world program without the thrift library linked shows this
>>>> strace (only the last relevant lines included):
>>>>
>>>>
>>>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>> ...}) = 0
>>>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>> ...}) = 0
>>>> brk(0)                                  = 0x88a7000
>>>> brk(0x88a8000)                          = 0x88a8000
>>>> write(1, "Hello World\n", 12Hello World
>>>> )           = 12
>>>> _exit(0)
>>>>
>>>>
>>>> For me, it looks like an problem with "getrlimit" or "setrlimit" function.
>>>>
>>>> Lind regards,
>>>>
>>>> Siamak Haschemi
>>>>
>>>> Siamak Haschemi schrieb:
>>>>> Hello again,
>>>>>
>>>>> I don't know if it helps, but here is some more information:
>>>>>
>>>>>
>>>>>
>>>>> root@OpenWrt:~# ldd ./hello
>>>>>         libthrift.so.0 => /lib/libthrift.so.0 (0xb7f23000)
>>>>>         libstdc++.so.6 => /lib/libstdc++.so.6 (0xb7e68000)
>>>>>         libm.so.0 => /lib/libm.so.0 (0xb7e5b000)
>>>>>         libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7e52000)
>>>>>         libc.so.0 => /lib/libc.so.0 (0xb7e08000)
>>>>>         librt.so.0 => /lib/librt.so.0 (0xb7e05000)
>>>>>         libpthread.so.0 => /lib/libpthread.so.0 (0xb7df3000)
>>>>>         ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb7fb9000)
>>>>>
>>>>>
>>>>>
>>>>> root@OpenWrt:~# strace ./hello
>>>>> execve("/bin/hello", ["/bin/hello"], [/* 8 vars */]) = 0
>>>>> mmap2(NULL, 20, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
>>>>> = 0xb7f52000
>>>>> stat("/etc/ld.so.cache", 0xbff56254)    = -1 ENOENT (No such file or
>>>>> directory)
>>>>> open("/lib/libthrift.so.0", O_RDONLY)   = 3
>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=604571, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20q\2\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 606208, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>> 0xb7ebd000
>>>>> mmap2(0xb7ebd000, 591833, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7ebd000
>>>>> mmap2(0xb7f4e000, 10651, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0x91) = 0xb7f4e000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0,\0\4\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 765952, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>> 0xb7e02000
>>>>> mmap2(0xb7e02000, 719316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7e02000
>>>>> mmap2(0xb7eb2000, 20473, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0xb0) = 0xb7eb2000
>>>>> mmap2(0xb7eb7000, 23828, PROT_READ|PROT_WRITE,
>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7eb7000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0t\21\0\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 53248, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7df5000
>>>>> mmap2(0xb7df5000, 41028, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7df5000
>>>>> mmap2(0xb7e00000, 4120, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0xa) = 0xb7e00000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0H\25\0\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 36864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7dec000
>>>>> mmap2(0xb7dec000, 31592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7dec000
>>>>> mmap2(0xb7df4000, 3302, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0x7) = 0xb7df4000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\251\0\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 303104, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>>> 0xb7da2000
>>>>> mmap2(0xb7da2000, 271528, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7da2000
>>>>> mmap2(0xb7de5000, 5309, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0x42) = 0xb7de5000
>>>>> mmap2(0xb7de7000, 16988, PROT_READ|PROT_WRITE,
>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7de7000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/librt.so.0", O_RDONLY)       = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=4110, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\344\4\0\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 12288, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d9f000
>>>>> mmap2(0xb7d9f000, 2336, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7d9f000
>>>>> mmap2(0xb7da0000, 4110, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7da0000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/libpthread.so.0", O_RDONLY)  = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=58930, ...}) = 0
>>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>>> 0) = 0xb7f51000
>>>>> read(3,
>>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0004=\0\0004\0\0\0"...,
>>>>> 4096) = 4096
>>>>> mmap2(NULL, 73728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d8d000
>>>>> mmap2(0xb7d8d000, 37304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0) = 0xb7d8d000
>>>>> mmap2(0xb7d97000, 22066, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>>> 0x9) = 0xb7d97000
>>>>> mmap2(0xb7d9d000, 6232, PROT_READ|PROT_WRITE,
>>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7d9d000
>>>>> close(3)                                = 0
>>>>> munmap(0xb7f51000, 4096)                = 0
>>>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> close(3)                                = 0
>>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>>> close(3)                                = 0
>>>>> stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=16390, ...}) = 0
>>>>> mprotect(0xb7eb2000, 16384, PROT_READ)  = 0
>>>>> mprotect(0xb7e00000, 4096, PROT_READ)   = 0
>>>>> mprotect(0xb7de5000, 4096, PROT_READ)   = 0
>>>>> mprotect(0xb7da0000, 4096, PROT_READ)   = 0
>>>>> mprotect(0xb7d97000, 4096, PROT_READ)   = 0
>>>>> mprotect(0xb7f57000, 4096, PROT_READ)   = 0
>>>>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>> ...}) = 0
>>>>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>>> ...}) = 0
>>>>> getpid()                                = 2933
>>>>> getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
>>>>> setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=RLIM_INFINITY}) = 0
>>>>> rt_sigaction(SIGRTMIN, {0xb7d95f96, [], SA_RESTORER, 0xb7dac998}, NULL,
>>>>> 8) = 0
>>>>> rt_sigaction(SIGRT_1, {0xb7d95efe, [RTMIN], SA_RESTORER, 0xb7dac998},
>>>>> NULL, 8) = 0
>>>>> rt_sigaction(SIGRT_2, {0xb7d9562a, [], SA_RESTORER, 0xb7dac998}, NULL,
>>>>> 8) = 0
>>>>> rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
>>>>> rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 8) = 0
>>>>> --- SIGSEGV (Segmentation fault) @ 0 (0) ---
>>>>> +++ killed by SIGSEGV +++
>>>>>
>>>>>
>>>>>
>>>>> Kind regards,
>>>>>
>>>>> Siamak Haschemi
>>>>>
>>>>> Siamak Haschemi schrieb:
>>>>>> Hello,
>>>>>>
>>>>>> as you seen here (https://issues.apache.org/jira/browse/THRIFT-177), I
>>>>>> am trying to cross-compile Thrift for the OpenWRT platform
>>>>>> (http://openwrt.org/), which is a Linux distribution for embedded devices.
>>>>>>
>>>>>> After a two-night-fight, my result are the following:
>>>>>>
>>>>>> - I've created a OpenWRT package for thrift (see the attachment if you
>>>>>> are interested).
>>>>>> - I've successfully compiled the cpp-library (which results in
>>>>>> libthrift, libthriftz and libthriftnb)
>>>>>> - For now, I will not cross-compile the thrift-compiler since I will
>>>>>> compile the thrift definition files on my PC.
>>>>>>
>>>>>> Coming to this point, I was very happy and I thought that the story
>>>>>> ends, but now I am faced with a problem I cannot solve myself:
>>>>>>
>>>>>> For testing my cross-compilation result, I cross-compiled the cpp-part
>>>>>> of the thrift tutorial. I installed the cross-compiled libraries on the
>>>>>> target device and start the CppServer and the only reaction was
>>>>>> "Segmentation Fault" :-(
>>>>>>
>>>>>>
>>>>>> I tried to backtrack the problem and I came to the finding, that a
>>>>>> simple hello world program, which is linked to my cross-compiled
>>>>>> thrift-library, causes the "Segmentation Fault". Without linking the
>>>>>> thrift-library, everything is O.K.
>>>>>>
>>>>>>
>>>>>> =======================
>>>>>> ------------
>>>>>> Hello.cpp
>>>>>> ------------
>>>>>>
>>>>>> #include <iostream>
>>>>>>
>>>>>> using namespace std;
>>>>>>
>>>>>> int main(int argc, char **argv) {
>>>>>>   printf("Hello World!\n");
>>>>>>   return 0;
>>>>>> }
>>>>>>
>>>>>> 1) First try
>>>>>>
>>>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent *-lthrift* -o Hello Hello.cpp
>>>>>>
>>>>>> On the target device:
>>>>>>
>>>>>> root@OpenWrt:~# ./Hello
>>>>>> Segmentation fault
>>>>>>
>>>>>> 2) Second try
>>>>>>
>>>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent -o Hello Hello.cpp
>>>>>>
>>>>>> On the target device:
>>>>>>
>>>>>> root@OpenWrt:~# ./Hello
>>>>>> Hello World!
>>>>>>
>>>>>> ======================
>>>>>>
>>>>>> I will try to debug it with gdb, but I'm not an expert in this.
>>>>>>
>>>>>>
>>>>>> So, please, can someone help me?
>>>>>>
>>>>>>
>>>>>>
>>>>>> Kind regards,
>>>>>>
>>>>>> Siamak Haschemi
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>

Re: Use Thrift in the OpenWRT platform

Posted by Siamak Haschemi <ha...@informatik.hu-berlin.de>.
Hello again,

now I have some results:

>1/ If you can run your program under gdb, please do so.  When it crashes,
>execute the "backtrace" command.  Paste the results.

Type "help" followed by a class name for a list of commands in that class.
Type "help all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.
(gdb) help breakpoints
Making program stop at certain points.

List of commands:

awatch -- Set a watchpoint for an expression
break -- Set breakpoint at specified line or function
catch -- Set catchpoints to catch events
clear -- Clear breakpoint at specified line or function
commands -- Set commands to be executed when a breakpoint is hit
condition -- Specify breakpoint number N to break only if COND is true
delete -- Delete some breakpoints or auto-display expressions
delete breakpoints -- Delete some breakpoints or auto-display expressions
delete checkpoint -- Delete a fork/checkpoint (experimental)
delete display -- Cancel some expressions to be displayed when program stops
delete mem -- Delete memory region
delete tracepoints -- Delete specified tracepoints
disable -- Disable some breakpoints
disable breakpoints -- Disable some breakpoints
disable display -- Disable some expressions to be displayed when program
stops
disable mem -- Disable memory region
disable tracepoints -- Disable specified tracepoints
enable -- Enable some breakpoints
enable delete -- Enable breakpoints and delete when hit
enable display -- Enable some expressions to be displayed when program stops
enable mem -- Enable memory region
enable once -- Enable breakpoints for one hit
enable tracepoints -- Enable specified tracepoints
hbreak -- Set a hardware assisted  breakpoint
ignore -- Set ignore-count of breakpoint number N to COUNT
rbreak -- Set a breakpoint for all functions matching REGEXP
rwatch -- Set a read watchpoint for an expression
tbreak -- Set a temporary breakpoint
tcatch -- Set temporary catchpoints to catch events
thbreak -- Set a temporary hardware assisted breakpoint
watch -- Set a watchpoint for an expression

Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.
(gdb) breakpoints clear
Undefined command: "breakpoints".  Try "help".
(gdb) break clear
Function "clear" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n
(gdb) quit
siamak@siamak-desktop:~/seismo-openwrt/trunk/build_dir/i386/root-x86$ gdb
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
(gdb) >> 1/ If you can run your program under gdb, please do so.  When
it crashes,
Undefined command: ">>".  Try "help".
(gdb) >> execute the "backtrace" command.  Paste the results.Quit
(gdb) quit
siamak@siamak-desktop:~/seismo-openwrt/trunk/build_dir/i386/root-x86$ gdb
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
(gdb) set solib-absolute-prefix
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86
(gdb) file bin/hello
Reading symbols from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/bin/hello...done.
(gdb) target remote 141.20.23.212:2345
Remote debugging using 141.20.23.212:2345
0xb7f6e910 in _start () from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
(gdb) continue
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0xb7dafb0a in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
(gdb) bt
#0  0xb7dafb0a in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#1  0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#2  0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#3  0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#4  0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#5  0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#6  0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#7  0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#8  0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#9  0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#10 0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#11 0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#12 0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#13 0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#14 0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#15 0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#16 0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#17 0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#18 0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#19 0xb7dafb2b in _pthread_cleanup_push_defer ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
---Type <return> to continue, or q <return> to quit---

>2/ execute the command "break setrlimit", then "run" (say "yes" when it
>asks you if you want to start your program from the beginning).  It should
>stop right before calling setrlimit.  Paste the backtrace

Breakpoint 1, 0xb7db5aa5 in setrlimit ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
(gdb) bt
#0  0xb7db5aa5 in setrlimit () from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libc.so.0
#1  0xb7d9bb22 in ?? () from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
#2  0xb7d9c137 in ?? () from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
#3  0xb7d966c1 in ?? () from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/libpthread.so.0
#4  0xb7fa73f0 in _dl_get_ready_to_run ()
   from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
#5  0xb7fa76ea in ?? () from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0
#6  0xb7fa4915 in _start () from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/root-x86/lib/ld-uClibc.so.0



Kind regards,

Siamak

Siamak Haschemi schrieb:
> Hello David,
> 
> thank you for helping me!
> 
> I have troubles in setting breakpoints. I'm forced to use gdbserver with
> gdb. I replaced the real IP with DEVICE_IP in this E-Mail.
> 
> See my comments below.
> 
> David Reiss schrieb:
>> Can you please report the following...
>>
>> 1/ If you can run your program under gdb, please do so.  When it crashes,
>> execute the "backtrace" command.  Paste the results.
> 
> GNU gdb 6.8-debian
> Copyright (C) 2008 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later
> <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "i486-linux-gnu".
> (gdb) symbol-file hello
> Reading symbols from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
> (gdb) target remote DEVICE_IP:2345
> Remote debugging using DEVICE_IP:2345
> 0xb7f23910 in ?? ()
> (gdb) continue
> Continuing.
> 
> Program received signal SIGSEGV, Segmentation fault.
> 0xb7d6db0a in ?? ()
> (gdb) backtrace
> #0  0xb7d6db0a in ?? ()
> #1  0xb7d6db2b in ?? ()
> #2  0xb7d6db2b in ?? ()
> #3  0xb7d6db2b in ?? ()
> #4  0xb7d6db2b in ?? ()
> #5  0xb7d6db2b in ?? ()
> #6  0xb7d6db2b in ?? ()
> #7  0xb7d6db2b in ?? ()
> #8  0xb7d6db2b in ?? ()
> #9  0xb7d6db2b in ?? ()
> #10 0xb7d6db2b in ?? ()
> #11 0xb7d6db2b in ?? ()
> #12 0xb7d6db2b in ?? ()
> #13 0xb7d6db2b in ?? ()
> #14 0xb7d6db2b in ?? ()
> #15 0xb7d6db2b in ?? ()
> #16 0xb7d6db2b in ?? ()
> #17 0xb7d6db2b in ?? ()
> #18 0xb7d6db2b in ?? ()
> #19 0xb7d6db2b in ?? ()
> #20 0xb7d6db2b in ?? ()
> #21 0xb7d6db2b in ?? ()
> #22 0xb7d6db2b in ?? ()
> #23 0xb7d6db2b in ?? ()
> #24 0xb7d6db2b in ?? ()
> #25 0xb7d6db2b in ?? ()
> #26 0xb7d6db2b in ?? ()
> #27 0xb7d6db2b in ?? ()
> #28 0xb7d6db2b in ?? ()
> #29 0xb7d6db2b in ?? ()
> #30 0xb7d6db2b in ?? ()
> #31 0xb7d6db2b in ?? ()
> #32 0xb7d6db2b in ?? ()
> #33 0xb7d6db2b in ?? ()
> ---Type <return> to continue, or q <return> to quit---
> #34 0xb7d6db2b in ?? ()
> #35 0xb7d6db2b in ?? ()
> #36 0xb7d6db2b in ?? ()
> #37 0xb7d6db2b in ?? ()
> #38 0xb7d6db2b in ?? ()
> #39 0xb7d6db2b in ?? ()
> #40 0xb7d6db2b in ?? ()
> #41 0xb7d6db2b in ?? ()
> #42 0xb7d6db2b in ?? ()
> #43 0xb7d6db2b in ?? ()
> #44 0xb7d6db2b in ?? ()
> #45 0xb7d6db2b in ?? ()
> #46 0xb7d6db2b in ?? ()
> #47 0xb7d6db2b in ?? ()
> #48 0xb7d6db2b in ?? ()
> #49 0xb7d6db2b in ?? ()
> #50 0xb7d6db2b in ?? ()
> #51 0xb7d6db2b in ?? ()
> #52 0xb7d6db2b in ?? ()
> #53 0xb7d6db2b in ?? ()
> #54 0xb7d6db2b in ?? ()
> #55 0xb7d6db2b in ?? ()
> #56 0xb7d6db2b in ?? ()
> #57 0xb7d6db2b in ?? ()
> #58 0xb7d6db2b in ?? ()
> #59 0xb7d6db2b in ?? ()
> #60 0xb7d6db2b in ?? ()
> #61 0xb7d6db2b in ?? ()
> #62 0xb7d6db2b in ?? ()
> #63 0xb7d6db2b in ?? ()
> #64 0xb7d6db2b in ?? ()
> #65 0xb7d6db2b in ?? ()
> #66 0xb7d6db2b in ?? ()
> #67 0xb7d6db2b in ?? ()
> ---Type <return> to continue, or q <return> to quit---
> ... and so on
> 
>> 2/ execute the command "break setrlimit", then "run" (say "yes" when it
>> asks you if you want to start your program from the beginning).  It should
>> stop right before calling setrlimit.  Paste the backtrace.
> 
> GNU gdb 6.8-debian
> Copyright (C) 2008 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later
> <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "i486-linux-gnu".
> (gdb) symbol-file hello
> Reading symbols from
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
> (gdb) target remote DEVICE_IP:2345
> Remote debugging using DEVLICE_IP:2345
> 0xb7f9c910 in ?? ()
> (gdb) break setrlimit
> Function "setrlimit" not defined.
> Make breakpoint pending on future shared library load? (y or [n]) y
> Breakpoint 1 (setrlimit) pending.
> (gdb) c
> Continuing.
> 
> Program received signal SIGSEGV, Segmentation fault.
> 0xb7de6b0a in ?? ()
> 
> :-( gdb does not stop at the breakpoint.
> 
> 
> 
>> Please make sure that you have compiled Thrift for debugging.
>> ("./configure CXXFLAGS='-O0 -g'").
> 
> I run another test in which I force the loading of a library:
> 
> 1)
> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libz.so.1 echo hello
> hello
> 
> 2)
> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libnl.so.1 echo hello
> hello
> 
> 3)
> root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libthrift.so.0 echo hello
> Segmentation fault
> 
> 
> ======
> 
> 
> And here are some (relevant) outputs from the build:
> 
> 
> CFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include "
> 
> CXXFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include  -g"
> 
> LDFLAGS="-L/home/siamak/seismo-openwrt/trunk/staging_dir/toolchain-i386_gcc4.1.2/lib
> -L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/lib
> -L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/lib " make -C
> /home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/lib/cpp
> 
> DESTDIR="/home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/ipkg-install"
> 
> 
> AR=i386-linux-uclibc-ar AS="ccache i386-linux-uclibc-gcc -c -O2 -pipe
> -march=i486 -funit-at-a-time -fhonour-copts" LD=i386-linux-uclibc-ld
> 
> NM=i386-linux-uclibc-nm
> CC="ccache i386-linux-uclibc-gcc"
> GCC="ccache i386-linux-uclibc-gcc"
> CXX="i386-linux-uclibc-g++"
> RANLIB=i386-linux-uclibc-ranlib
> STRIP=i386-linux-uclibc-strip
> OBJCOPY=i386-linux-uclibc-objcopy
> OBJDUMP=i386-linux-uclibc-objdump
> SIZE=i386-linux-uclibc-size
> CROSS="i386-linux-uclibc-"
> ARCH="i386"
> 
> 
> i386-linux-uclibc-g++ -DHAVE_CONFIG_H -I. -I. -I../.. -I./src
> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
> -I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include -Wall -O0
> -g -MT Monitor.lo -MD -MP -MF .deps/Monitor.Tpo -c
> src/concurrency/Monitor.cpp  -fPIC -DPIC -o .libs/Monitor.o
> 
> 
>> --David
>>
>> Siamak Haschemi wrote:
>>> Hello again,
>>>
>>> the Hello world program without the thrift library linked shows this
>>> strace (only the last relevant lines included):
>>>
>>>
>>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>> ...}) = 0
>>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>> ...}) = 0
>>> brk(0)                                  = 0x88a7000
>>> brk(0x88a8000)                          = 0x88a8000
>>> write(1, "Hello World\n", 12Hello World
>>> )           = 12
>>> _exit(0)
>>>
>>>
>>> For me, it looks like an problem with "getrlimit" or "setrlimit" function.
>>>
>>> Lind regards,
>>>
>>> Siamak Haschemi
>>>
>>> Siamak Haschemi schrieb:
>>>> Hello again,
>>>>
>>>> I don't know if it helps, but here is some more information:
>>>>
>>>>
>>>>
>>>> root@OpenWrt:~# ldd ./hello
>>>>         libthrift.so.0 => /lib/libthrift.so.0 (0xb7f23000)
>>>>         libstdc++.so.6 => /lib/libstdc++.so.6 (0xb7e68000)
>>>>         libm.so.0 => /lib/libm.so.0 (0xb7e5b000)
>>>>         libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7e52000)
>>>>         libc.so.0 => /lib/libc.so.0 (0xb7e08000)
>>>>         librt.so.0 => /lib/librt.so.0 (0xb7e05000)
>>>>         libpthread.so.0 => /lib/libpthread.so.0 (0xb7df3000)
>>>>         ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb7fb9000)
>>>>
>>>>
>>>>
>>>> root@OpenWrt:~# strace ./hello
>>>> execve("/bin/hello", ["/bin/hello"], [/* 8 vars */]) = 0
>>>> mmap2(NULL, 20, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
>>>> = 0xb7f52000
>>>> stat("/etc/ld.so.cache", 0xbff56254)    = -1 ENOENT (No such file or
>>>> directory)
>>>> open("/lib/libthrift.so.0", O_RDONLY)   = 3
>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=604571, ...}) = 0
>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>> 0) = 0xb7f51000
>>>> read(3,
>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20q\2\0004\0\0\0"...,
>>>> 4096) = 4096
>>>> mmap2(NULL, 606208, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>> 0xb7ebd000
>>>> mmap2(0xb7ebd000, 591833, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0) = 0xb7ebd000
>>>> mmap2(0xb7f4e000, 10651, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0x91) = 0xb7f4e000
>>>> close(3)                                = 0
>>>> munmap(0xb7f51000, 4096)                = 0
>>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>> 0) = 0xb7f51000
>>>> read(3,
>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0,\0\4\0004\0\0\0"...,
>>>> 4096) = 4096
>>>> mmap2(NULL, 765952, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>> 0xb7e02000
>>>> mmap2(0xb7e02000, 719316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0) = 0xb7e02000
>>>> mmap2(0xb7eb2000, 20473, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0xb0) = 0xb7eb2000
>>>> mmap2(0xb7eb7000, 23828, PROT_READ|PROT_WRITE,
>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7eb7000
>>>> close(3)                                = 0
>>>> munmap(0xb7f51000, 4096)                = 0
>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>> 0) = 0xb7f51000
>>>> read(3,
>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0t\21\0\0004\0\0\0"...,
>>>> 4096) = 4096
>>>> mmap2(NULL, 53248, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7df5000
>>>> mmap2(0xb7df5000, 41028, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0) = 0xb7df5000
>>>> mmap2(0xb7e00000, 4120, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0xa) = 0xb7e00000
>>>> close(3)                                = 0
>>>> munmap(0xb7f51000, 4096)                = 0
>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>> 0) = 0xb7f51000
>>>> read(3,
>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0H\25\0\0004\0\0\0"...,
>>>> 4096) = 4096
>>>> mmap2(NULL, 36864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7dec000
>>>> mmap2(0xb7dec000, 31592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0) = 0xb7dec000
>>>> mmap2(0xb7df4000, 3302, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0x7) = 0xb7df4000
>>>> close(3)                                = 0
>>>> munmap(0xb7f51000, 4096)                = 0
>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>> 0) = 0xb7f51000
>>>> read(3,
>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\251\0\0004\0\0\0"...,
>>>> 4096) = 4096
>>>> mmap2(NULL, 303104, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>>> 0xb7da2000
>>>> mmap2(0xb7da2000, 271528, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0) = 0xb7da2000
>>>> mmap2(0xb7de5000, 5309, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0x42) = 0xb7de5000
>>>> mmap2(0xb7de7000, 16988, PROT_READ|PROT_WRITE,
>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7de7000
>>>> close(3)                                = 0
>>>> munmap(0xb7f51000, 4096)                = 0
>>>> open("/lib/librt.so.0", O_RDONLY)       = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=4110, ...}) = 0
>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>> 0) = 0xb7f51000
>>>> read(3,
>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\344\4\0\0004\0\0\0"...,
>>>> 4096) = 4096
>>>> mmap2(NULL, 12288, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d9f000
>>>> mmap2(0xb7d9f000, 2336, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0) = 0xb7d9f000
>>>> mmap2(0xb7da0000, 4110, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0) = 0xb7da0000
>>>> close(3)                                = 0
>>>> munmap(0xb7f51000, 4096)                = 0
>>>> open("/lib/libpthread.so.0", O_RDONLY)  = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=58930, ...}) = 0
>>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>>> 0) = 0xb7f51000
>>>> read(3,
>>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0004=\0\0004\0\0\0"...,
>>>> 4096) = 4096
>>>> mmap2(NULL, 73728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d8d000
>>>> mmap2(0xb7d8d000, 37304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0) = 0xb7d8d000
>>>> mmap2(0xb7d97000, 22066, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>>> 0x9) = 0xb7d97000
>>>> mmap2(0xb7d9d000, 6232, PROT_READ|PROT_WRITE,
>>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7d9d000
>>>> close(3)                                = 0
>>>> munmap(0xb7f51000, 4096)                = 0
>>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>>> close(3)                                = 0
>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>> close(3)                                = 0
>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>> close(3)                                = 0
>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>> close(3)                                = 0
>>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>>> close(3)                                = 0
>>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>>> close(3)                                = 0
>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>> close(3)                                = 0
>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>> close(3)                                = 0
>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>> close(3)                                = 0
>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>> close(3)                                = 0
>>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>>> close(3)                                = 0
>>>> stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=16390, ...}) = 0
>>>> mprotect(0xb7eb2000, 16384, PROT_READ)  = 0
>>>> mprotect(0xb7e00000, 4096, PROT_READ)   = 0
>>>> mprotect(0xb7de5000, 4096, PROT_READ)   = 0
>>>> mprotect(0xb7da0000, 4096, PROT_READ)   = 0
>>>> mprotect(0xb7d97000, 4096, PROT_READ)   = 0
>>>> mprotect(0xb7f57000, 4096, PROT_READ)   = 0
>>>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>> ...}) = 0
>>>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>>> ...}) = 0
>>>> getpid()                                = 2933
>>>> getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
>>>> setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=RLIM_INFINITY}) = 0
>>>> rt_sigaction(SIGRTMIN, {0xb7d95f96, [], SA_RESTORER, 0xb7dac998}, NULL,
>>>> 8) = 0
>>>> rt_sigaction(SIGRT_1, {0xb7d95efe, [RTMIN], SA_RESTORER, 0xb7dac998},
>>>> NULL, 8) = 0
>>>> rt_sigaction(SIGRT_2, {0xb7d9562a, [], SA_RESTORER, 0xb7dac998}, NULL,
>>>> 8) = 0
>>>> rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
>>>> rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 8) = 0
>>>> --- SIGSEGV (Segmentation fault) @ 0 (0) ---
>>>> +++ killed by SIGSEGV +++
>>>>
>>>>
>>>>
>>>> Kind regards,
>>>>
>>>> Siamak Haschemi
>>>>
>>>> Siamak Haschemi schrieb:
>>>>> Hello,
>>>>>
>>>>> as you seen here (https://issues.apache.org/jira/browse/THRIFT-177), I
>>>>> am trying to cross-compile Thrift for the OpenWRT platform
>>>>> (http://openwrt.org/), which is a Linux distribution for embedded devices.
>>>>>
>>>>> After a two-night-fight, my result are the following:
>>>>>
>>>>> - I've created a OpenWRT package for thrift (see the attachment if you
>>>>> are interested).
>>>>> - I've successfully compiled the cpp-library (which results in
>>>>> libthrift, libthriftz and libthriftnb)
>>>>> - For now, I will not cross-compile the thrift-compiler since I will
>>>>> compile the thrift definition files on my PC.
>>>>>
>>>>> Coming to this point, I was very happy and I thought that the story
>>>>> ends, but now I am faced with a problem I cannot solve myself:
>>>>>
>>>>> For testing my cross-compilation result, I cross-compiled the cpp-part
>>>>> of the thrift tutorial. I installed the cross-compiled libraries on the
>>>>> target device and start the CppServer and the only reaction was
>>>>> "Segmentation Fault" :-(
>>>>>
>>>>>
>>>>> I tried to backtrack the problem and I came to the finding, that a
>>>>> simple hello world program, which is linked to my cross-compiled
>>>>> thrift-library, causes the "Segmentation Fault". Without linking the
>>>>> thrift-library, everything is O.K.
>>>>>
>>>>>
>>>>> =======================
>>>>> ------------
>>>>> Hello.cpp
>>>>> ------------
>>>>>
>>>>> #include <iostream>
>>>>>
>>>>> using namespace std;
>>>>>
>>>>> int main(int argc, char **argv) {
>>>>>   printf("Hello World!\n");
>>>>>   return 0;
>>>>> }
>>>>>
>>>>> 1) First try
>>>>>
>>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent *-lthrift* -o Hello Hello.cpp
>>>>>
>>>>> On the target device:
>>>>>
>>>>> root@OpenWrt:~# ./Hello
>>>>> Segmentation fault
>>>>>
>>>>> 2) Second try
>>>>>
>>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent -o Hello Hello.cpp
>>>>>
>>>>> On the target device:
>>>>>
>>>>> root@OpenWrt:~# ./Hello
>>>>> Hello World!
>>>>>
>>>>> ======================
>>>>>
>>>>> I will try to debug it with gdb, but I'm not an expert in this.
>>>>>
>>>>>
>>>>> So, please, can someone help me?
>>>>>
>>>>>
>>>>>
>>>>> Kind regards,
>>>>>
>>>>> Siamak Haschemi
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>

Re: Use Thrift in the OpenWRT platform

Posted by Siamak Haschemi <ha...@informatik.hu-berlin.de>.
Hello David,

thank you for helping me!

I have troubles in setting breakpoints. I'm forced to use gdbserver with
gdb. I replaced the real IP with DEVICE_IP in this E-Mail.

See my comments below.

David Reiss schrieb:
> Can you please report the following...
> 
> 1/ If you can run your program under gdb, please do so.  When it crashes,
> execute the "backtrace" command.  Paste the results.

GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
(gdb) symbol-file hello
Reading symbols from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
(gdb) target remote DEVICE_IP:2345
Remote debugging using DEVICE_IP:2345
0xb7f23910 in ?? ()
(gdb) continue
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0xb7d6db0a in ?? ()
(gdb) backtrace
#0  0xb7d6db0a in ?? ()
#1  0xb7d6db2b in ?? ()
#2  0xb7d6db2b in ?? ()
#3  0xb7d6db2b in ?? ()
#4  0xb7d6db2b in ?? ()
#5  0xb7d6db2b in ?? ()
#6  0xb7d6db2b in ?? ()
#7  0xb7d6db2b in ?? ()
#8  0xb7d6db2b in ?? ()
#9  0xb7d6db2b in ?? ()
#10 0xb7d6db2b in ?? ()
#11 0xb7d6db2b in ?? ()
#12 0xb7d6db2b in ?? ()
#13 0xb7d6db2b in ?? ()
#14 0xb7d6db2b in ?? ()
#15 0xb7d6db2b in ?? ()
#16 0xb7d6db2b in ?? ()
#17 0xb7d6db2b in ?? ()
#18 0xb7d6db2b in ?? ()
#19 0xb7d6db2b in ?? ()
#20 0xb7d6db2b in ?? ()
#21 0xb7d6db2b in ?? ()
#22 0xb7d6db2b in ?? ()
#23 0xb7d6db2b in ?? ()
#24 0xb7d6db2b in ?? ()
#25 0xb7d6db2b in ?? ()
#26 0xb7d6db2b in ?? ()
#27 0xb7d6db2b in ?? ()
#28 0xb7d6db2b in ?? ()
#29 0xb7d6db2b in ?? ()
#30 0xb7d6db2b in ?? ()
#31 0xb7d6db2b in ?? ()
#32 0xb7d6db2b in ?? ()
#33 0xb7d6db2b in ?? ()
---Type <return> to continue, or q <return> to quit---
#34 0xb7d6db2b in ?? ()
#35 0xb7d6db2b in ?? ()
#36 0xb7d6db2b in ?? ()
#37 0xb7d6db2b in ?? ()
#38 0xb7d6db2b in ?? ()
#39 0xb7d6db2b in ?? ()
#40 0xb7d6db2b in ?? ()
#41 0xb7d6db2b in ?? ()
#42 0xb7d6db2b in ?? ()
#43 0xb7d6db2b in ?? ()
#44 0xb7d6db2b in ?? ()
#45 0xb7d6db2b in ?? ()
#46 0xb7d6db2b in ?? ()
#47 0xb7d6db2b in ?? ()
#48 0xb7d6db2b in ?? ()
#49 0xb7d6db2b in ?? ()
#50 0xb7d6db2b in ?? ()
#51 0xb7d6db2b in ?? ()
#52 0xb7d6db2b in ?? ()
#53 0xb7d6db2b in ?? ()
#54 0xb7d6db2b in ?? ()
#55 0xb7d6db2b in ?? ()
#56 0xb7d6db2b in ?? ()
#57 0xb7d6db2b in ?? ()
#58 0xb7d6db2b in ?? ()
#59 0xb7d6db2b in ?? ()
#60 0xb7d6db2b in ?? ()
#61 0xb7d6db2b in ?? ()
#62 0xb7d6db2b in ?? ()
#63 0xb7d6db2b in ?? ()
#64 0xb7d6db2b in ?? ()
#65 0xb7d6db2b in ?? ()
#66 0xb7d6db2b in ?? ()
#67 0xb7d6db2b in ?? ()
---Type <return> to continue, or q <return> to quit---
... and so on

> 
> 2/ execute the command "break setrlimit", then "run" (say "yes" when it
> asks you if you want to start your program from the beginning).  It should
> stop right before calling setrlimit.  Paste the backtrace.

GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
(gdb) symbol-file hello
Reading symbols from
/home/siamak/seismo-openwrt/trunk/build_dir/i386/hello/hello...done.
(gdb) target remote DEVICE_IP:2345
Remote debugging using DEVLICE_IP:2345
0xb7f9c910 in ?? ()
(gdb) break setrlimit
Function "setrlimit" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (setrlimit) pending.
(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0xb7de6b0a in ?? ()

:-( gdb does not stop at the breakpoint.



> 
> Please make sure that you have compiled Thrift for debugging.
> ("./configure CXXFLAGS='-O0 -g'").

I run another test in which I force the loading of a library:

1)
root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libz.so.1 echo hello
hello

2)
root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libnl.so.1 echo hello
hello

3)
root@OpenWrt:~# env LD_PRELOAD=/usr/lib/libthrift.so.0 echo hello
Segmentation fault


======


And here are some (relevant) outputs from the build:


CFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
-I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
-I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include "

CXXFLAGS="-O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts
-I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
-I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include  -g"

LDFLAGS="-L/home/siamak/seismo-openwrt/trunk/staging_dir/toolchain-i386_gcc4.1.2/lib
-L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/lib
-L/home/siamak/seismo-openwrt/trunk/staging_dir/i386/lib " make -C
/home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/lib/cpp

DESTDIR="/home/siamak/seismo-openwrt/trunk/build_dir/i386/thrift/ipkg-install"


AR=i386-linux-uclibc-ar AS="ccache i386-linux-uclibc-gcc -c -O2 -pipe
-march=i486 -funit-at-a-time -fhonour-copts" LD=i386-linux-uclibc-ld

NM=i386-linux-uclibc-nm
CC="ccache i386-linux-uclibc-gcc"
GCC="ccache i386-linux-uclibc-gcc"
CXX="i386-linux-uclibc-g++"
RANLIB=i386-linux-uclibc-ranlib
STRIP=i386-linux-uclibc-strip
OBJCOPY=i386-linux-uclibc-objcopy
OBJDUMP=i386-linux-uclibc-objdump
SIZE=i386-linux-uclibc-size
CROSS="i386-linux-uclibc-"
ARCH="i386"


i386-linux-uclibc-g++ -DHAVE_CONFIG_H -I. -I. -I../.. -I./src
-I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/usr/include
-I/home/siamak/seismo-openwrt/trunk/staging_dir/i386/include -Wall -O0
-g -MT Monitor.lo -MD -MP -MF .deps/Monitor.Tpo -c
src/concurrency/Monitor.cpp  -fPIC -DPIC -o .libs/Monitor.o


> 
> --David
> 
> Siamak Haschemi wrote:
>> Hello again,
>>
>> the Hello world program without the thrift library linked shows this
>> strace (only the last relevant lines included):
>>
>>
>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>> ...}) = 0
>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>> ...}) = 0
>> brk(0)                                  = 0x88a7000
>> brk(0x88a8000)                          = 0x88a8000
>> write(1, "Hello World\n", 12Hello World
>> )           = 12
>> _exit(0)
>>
>>
>> For me, it looks like an problem with "getrlimit" or "setrlimit" function.
>>
>> Lind regards,
>>
>> Siamak Haschemi
>>
>> Siamak Haschemi schrieb:
>>> Hello again,
>>>
>>> I don't know if it helps, but here is some more information:
>>>
>>>
>>>
>>> root@OpenWrt:~# ldd ./hello
>>>         libthrift.so.0 => /lib/libthrift.so.0 (0xb7f23000)
>>>         libstdc++.so.6 => /lib/libstdc++.so.6 (0xb7e68000)
>>>         libm.so.0 => /lib/libm.so.0 (0xb7e5b000)
>>>         libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7e52000)
>>>         libc.so.0 => /lib/libc.so.0 (0xb7e08000)
>>>         librt.so.0 => /lib/librt.so.0 (0xb7e05000)
>>>         libpthread.so.0 => /lib/libpthread.so.0 (0xb7df3000)
>>>         ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb7fb9000)
>>>
>>>
>>>
>>> root@OpenWrt:~# strace ./hello
>>> execve("/bin/hello", ["/bin/hello"], [/* 8 vars */]) = 0
>>> mmap2(NULL, 20, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
>>> = 0xb7f52000
>>> stat("/etc/ld.so.cache", 0xbff56254)    = -1 ENOENT (No such file or
>>> directory)
>>> open("/lib/libthrift.so.0", O_RDONLY)   = 3
>>> fstat(3, {st_mode=S_IFREG|0755, st_size=604571, ...}) = 0
>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>> 0) = 0xb7f51000
>>> read(3,
>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20q\2\0004\0\0\0"...,
>>> 4096) = 4096
>>> mmap2(NULL, 606208, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>> 0xb7ebd000
>>> mmap2(0xb7ebd000, 591833, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0) = 0xb7ebd000
>>> mmap2(0xb7f4e000, 10651, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0x91) = 0xb7f4e000
>>> close(3)                                = 0
>>> munmap(0xb7f51000, 4096)                = 0
>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>> 0) = 0xb7f51000
>>> read(3,
>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0,\0\4\0004\0\0\0"...,
>>> 4096) = 4096
>>> mmap2(NULL, 765952, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>> 0xb7e02000
>>> mmap2(0xb7e02000, 719316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0) = 0xb7e02000
>>> mmap2(0xb7eb2000, 20473, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0xb0) = 0xb7eb2000
>>> mmap2(0xb7eb7000, 23828, PROT_READ|PROT_WRITE,
>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7eb7000
>>> close(3)                                = 0
>>> munmap(0xb7f51000, 4096)                = 0
>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>> 0) = 0xb7f51000
>>> read(3,
>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0t\21\0\0004\0\0\0"...,
>>> 4096) = 4096
>>> mmap2(NULL, 53248, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7df5000
>>> mmap2(0xb7df5000, 41028, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0) = 0xb7df5000
>>> mmap2(0xb7e00000, 4120, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0xa) = 0xb7e00000
>>> close(3)                                = 0
>>> munmap(0xb7f51000, 4096)                = 0
>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>> 0) = 0xb7f51000
>>> read(3,
>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0H\25\0\0004\0\0\0"...,
>>> 4096) = 4096
>>> mmap2(NULL, 36864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7dec000
>>> mmap2(0xb7dec000, 31592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0) = 0xb7dec000
>>> mmap2(0xb7df4000, 3302, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0x7) = 0xb7df4000
>>> close(3)                                = 0
>>> munmap(0xb7f51000, 4096)                = 0
>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>> 0) = 0xb7f51000
>>> read(3,
>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\251\0\0004\0\0\0"...,
>>> 4096) = 4096
>>> mmap2(NULL, 303104, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>>> 0xb7da2000
>>> mmap2(0xb7da2000, 271528, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0) = 0xb7da2000
>>> mmap2(0xb7de5000, 5309, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0x42) = 0xb7de5000
>>> mmap2(0xb7de7000, 16988, PROT_READ|PROT_WRITE,
>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7de7000
>>> close(3)                                = 0
>>> munmap(0xb7f51000, 4096)                = 0
>>> open("/lib/librt.so.0", O_RDONLY)       = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=4110, ...}) = 0
>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>> 0) = 0xb7f51000
>>> read(3,
>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\344\4\0\0004\0\0\0"...,
>>> 4096) = 4096
>>> mmap2(NULL, 12288, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d9f000
>>> mmap2(0xb7d9f000, 2336, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0) = 0xb7d9f000
>>> mmap2(0xb7da0000, 4110, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0) = 0xb7da0000
>>> close(3)                                = 0
>>> munmap(0xb7f51000, 4096)                = 0
>>> open("/lib/libpthread.so.0", O_RDONLY)  = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=58930, ...}) = 0
>>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>>> 0) = 0xb7f51000
>>> read(3,
>>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0004=\0\0004\0\0\0"...,
>>> 4096) = 4096
>>> mmap2(NULL, 73728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d8d000
>>> mmap2(0xb7d8d000, 37304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0) = 0xb7d8d000
>>> mmap2(0xb7d97000, 22066, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>>> 0x9) = 0xb7d97000
>>> mmap2(0xb7d9d000, 6232, PROT_READ|PROT_WRITE,
>>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7d9d000
>>> close(3)                                = 0
>>> munmap(0xb7f51000, 4096)                = 0
>>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>>> close(3)                                = 0
>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>> close(3)                                = 0
>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>> close(3)                                = 0
>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>> close(3)                                = 0
>>> open("/lib/libm.so.0", O_RDONLY)        = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>>> close(3)                                = 0
>>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>>> close(3)                                = 0
>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>> close(3)                                = 0
>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>> close(3)                                = 0
>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>> close(3)                                = 0
>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>> close(3)                                = 0
>>> open("/lib/libc.so.0", O_RDONLY)        = 3
>>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>>> close(3)                                = 0
>>> stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=16390, ...}) = 0
>>> mprotect(0xb7eb2000, 16384, PROT_READ)  = 0
>>> mprotect(0xb7e00000, 4096, PROT_READ)   = 0
>>> mprotect(0xb7de5000, 4096, PROT_READ)   = 0
>>> mprotect(0xb7da0000, 4096, PROT_READ)   = 0
>>> mprotect(0xb7d97000, 4096, PROT_READ)   = 0
>>> mprotect(0xb7f57000, 4096, PROT_READ)   = 0
>>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>> ...}) = 0
>>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>>> ...}) = 0
>>> getpid()                                = 2933
>>> getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
>>> setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=RLIM_INFINITY}) = 0
>>> rt_sigaction(SIGRTMIN, {0xb7d95f96, [], SA_RESTORER, 0xb7dac998}, NULL,
>>> 8) = 0
>>> rt_sigaction(SIGRT_1, {0xb7d95efe, [RTMIN], SA_RESTORER, 0xb7dac998},
>>> NULL, 8) = 0
>>> rt_sigaction(SIGRT_2, {0xb7d9562a, [], SA_RESTORER, 0xb7dac998}, NULL,
>>> 8) = 0
>>> rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
>>> rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 8) = 0
>>> --- SIGSEGV (Segmentation fault) @ 0 (0) ---
>>> +++ killed by SIGSEGV +++
>>>
>>>
>>>
>>> Kind regards,
>>>
>>> Siamak Haschemi
>>>
>>> Siamak Haschemi schrieb:
>>>> Hello,
>>>>
>>>> as you seen here (https://issues.apache.org/jira/browse/THRIFT-177), I
>>>> am trying to cross-compile Thrift for the OpenWRT platform
>>>> (http://openwrt.org/), which is a Linux distribution for embedded devices.
>>>>
>>>> After a two-night-fight, my result are the following:
>>>>
>>>> - I've created a OpenWRT package for thrift (see the attachment if you
>>>> are interested).
>>>> - I've successfully compiled the cpp-library (which results in
>>>> libthrift, libthriftz and libthriftnb)
>>>> - For now, I will not cross-compile the thrift-compiler since I will
>>>> compile the thrift definition files on my PC.
>>>>
>>>> Coming to this point, I was very happy and I thought that the story
>>>> ends, but now I am faced with a problem I cannot solve myself:
>>>>
>>>> For testing my cross-compilation result, I cross-compiled the cpp-part
>>>> of the thrift tutorial. I installed the cross-compiled libraries on the
>>>> target device and start the CppServer and the only reaction was
>>>> "Segmentation Fault" :-(
>>>>
>>>>
>>>> I tried to backtrack the problem and I came to the finding, that a
>>>> simple hello world program, which is linked to my cross-compiled
>>>> thrift-library, causes the "Segmentation Fault". Without linking the
>>>> thrift-library, everything is O.K.
>>>>
>>>>
>>>> =======================
>>>> ------------
>>>> Hello.cpp
>>>> ------------
>>>>
>>>> #include <iostream>
>>>>
>>>> using namespace std;
>>>>
>>>> int main(int argc, char **argv) {
>>>>   printf("Hello World!\n");
>>>>   return 0;
>>>> }
>>>>
>>>> 1) First try
>>>>
>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent *-lthrift* -o Hello Hello.cpp
>>>>
>>>> On the target device:
>>>>
>>>> root@OpenWrt:~# ./Hello
>>>> Segmentation fault
>>>>
>>>> 2) Second try
>>>>
>>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent -o Hello Hello.cpp
>>>>
>>>> On the target device:
>>>>
>>>> root@OpenWrt:~# ./Hello
>>>> Hello World!
>>>>
>>>> ======================
>>>>
>>>> I will try to debug it with gdb, but I'm not an expert in this.
>>>>
>>>>
>>>> So, please, can someone help me?
>>>>
>>>>
>>>>
>>>> Kind regards,
>>>>
>>>> Siamak Haschemi
>>>>
>>>>
>>>>
>>>>
>>>>

Re: Use Thrift in the OpenWRT platform

Posted by David Reiss <dr...@facebook.com>.
Can you please report the following...

1/ If you can run your program under gdb, please do so.  When it crashes,
execute the "backtrace" command.  Paste the results.

2/ execute the command "break setrlimit", then "run" (say "yes" when it
asks you if you want to start your program from the beginning).  It should
stop right before calling setrlimit.  Paste the backtrace.

Please make sure that you have compiled Thrift for debugging.
("./configure CXXFLAGS='-O0 -g'").

--David

Siamak Haschemi wrote:
> Hello again,
> 
> the Hello world program without the thrift library linked shows this
> strace (only the last relevant lines included):
> 
> 
> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
> ...}) = 0
> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
> ...}) = 0
> brk(0)                                  = 0x88a7000
> brk(0x88a8000)                          = 0x88a8000
> write(1, "Hello World\n", 12Hello World
> )           = 12
> _exit(0)
> 
> 
> For me, it looks like an problem with "getrlimit" or "setrlimit" function.
> 
> Lind regards,
> 
> Siamak Haschemi
> 
> Siamak Haschemi schrieb:
>> Hello again,
>>
>> I don't know if it helps, but here is some more information:
>>
>>
>>
>> root@OpenWrt:~# ldd ./hello
>>         libthrift.so.0 => /lib/libthrift.so.0 (0xb7f23000)
>>         libstdc++.so.6 => /lib/libstdc++.so.6 (0xb7e68000)
>>         libm.so.0 => /lib/libm.so.0 (0xb7e5b000)
>>         libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7e52000)
>>         libc.so.0 => /lib/libc.so.0 (0xb7e08000)
>>         librt.so.0 => /lib/librt.so.0 (0xb7e05000)
>>         libpthread.so.0 => /lib/libpthread.so.0 (0xb7df3000)
>>         ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb7fb9000)
>>
>>
>>
>> root@OpenWrt:~# strace ./hello
>> execve("/bin/hello", ["/bin/hello"], [/* 8 vars */]) = 0
>> mmap2(NULL, 20, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
>> = 0xb7f52000
>> stat("/etc/ld.so.cache", 0xbff56254)    = -1 ENOENT (No such file or
>> directory)
>> open("/lib/libthrift.so.0", O_RDONLY)   = 3
>> fstat(3, {st_mode=S_IFREG|0755, st_size=604571, ...}) = 0
>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>> 0) = 0xb7f51000
>> read(3,
>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20q\2\0004\0\0\0"...,
>> 4096) = 4096
>> mmap2(NULL, 606208, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>> 0xb7ebd000
>> mmap2(0xb7ebd000, 591833, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>> 0) = 0xb7ebd000
>> mmap2(0xb7f4e000, 10651, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>> 0x91) = 0xb7f4e000
>> close(3)                                = 0
>> munmap(0xb7f51000, 4096)                = 0
>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>> 0) = 0xb7f51000
>> read(3,
>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0,\0\4\0004\0\0\0"...,
>> 4096) = 4096
>> mmap2(NULL, 765952, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>> 0xb7e02000
>> mmap2(0xb7e02000, 719316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>> 0) = 0xb7e02000
>> mmap2(0xb7eb2000, 20473, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>> 0xb0) = 0xb7eb2000
>> mmap2(0xb7eb7000, 23828, PROT_READ|PROT_WRITE,
>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7eb7000
>> close(3)                                = 0
>> munmap(0xb7f51000, 4096)                = 0
>> open("/lib/libm.so.0", O_RDONLY)        = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>> 0) = 0xb7f51000
>> read(3,
>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0t\21\0\0004\0\0\0"...,
>> 4096) = 4096
>> mmap2(NULL, 53248, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7df5000
>> mmap2(0xb7df5000, 41028, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>> 0) = 0xb7df5000
>> mmap2(0xb7e00000, 4120, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>> 0xa) = 0xb7e00000
>> close(3)                                = 0
>> munmap(0xb7f51000, 4096)                = 0
>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>> 0) = 0xb7f51000
>> read(3,
>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0H\25\0\0004\0\0\0"...,
>> 4096) = 4096
>> mmap2(NULL, 36864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7dec000
>> mmap2(0xb7dec000, 31592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>> 0) = 0xb7dec000
>> mmap2(0xb7df4000, 3302, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>> 0x7) = 0xb7df4000
>> close(3)                                = 0
>> munmap(0xb7f51000, 4096)                = 0
>> open("/lib/libc.so.0", O_RDONLY)        = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>> 0) = 0xb7f51000
>> read(3,
>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\251\0\0004\0\0\0"...,
>> 4096) = 4096
>> mmap2(NULL, 303104, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
>> 0xb7da2000
>> mmap2(0xb7da2000, 271528, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>> 0) = 0xb7da2000
>> mmap2(0xb7de5000, 5309, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>> 0x42) = 0xb7de5000
>> mmap2(0xb7de7000, 16988, PROT_READ|PROT_WRITE,
>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7de7000
>> close(3)                                = 0
>> munmap(0xb7f51000, 4096)                = 0
>> open("/lib/librt.so.0", O_RDONLY)       = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=4110, ...}) = 0
>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>> 0) = 0xb7f51000
>> read(3,
>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\344\4\0\0004\0\0\0"...,
>> 4096) = 4096
>> mmap2(NULL, 12288, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d9f000
>> mmap2(0xb7d9f000, 2336, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>> 0) = 0xb7d9f000
>> mmap2(0xb7da0000, 4110, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>> 0) = 0xb7da0000
>> close(3)                                = 0
>> munmap(0xb7f51000, 4096)                = 0
>> open("/lib/libpthread.so.0", O_RDONLY)  = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=58930, ...}) = 0
>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>> 0) = 0xb7f51000
>> read(3,
>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0004=\0\0004\0\0\0"...,
>> 4096) = 4096
>> mmap2(NULL, 73728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d8d000
>> mmap2(0xb7d8d000, 37304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
>> 0) = 0xb7d8d000
>> mmap2(0xb7d97000, 22066, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
>> 0x9) = 0xb7d97000
>> mmap2(0xb7d9d000, 6232, PROT_READ|PROT_WRITE,
>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7d9d000
>> close(3)                                = 0
>> munmap(0xb7f51000, 4096)                = 0
>> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
>> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
>> close(3)                                = 0
>> open("/lib/libm.so.0", O_RDONLY)        = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>> close(3)                                = 0
>> open("/lib/libc.so.0", O_RDONLY)        = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>> close(3)                                = 0
>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>> close(3)                                = 0
>> open("/lib/libm.so.0", O_RDONLY)        = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
>> close(3)                                = 0
>> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
>> close(3)                                = 0
>> open("/lib/libc.so.0", O_RDONLY)        = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>> close(3)                                = 0
>> open("/lib/libc.so.0", O_RDONLY)        = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>> close(3)                                = 0
>> open("/lib/libc.so.0", O_RDONLY)        = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>> close(3)                                = 0
>> open("/lib/libc.so.0", O_RDONLY)        = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>> close(3)                                = 0
>> open("/lib/libc.so.0", O_RDONLY)        = 3
>> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
>> close(3)                                = 0
>> stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=16390, ...}) = 0
>> mprotect(0xb7eb2000, 16384, PROT_READ)  = 0
>> mprotect(0xb7e00000, 4096, PROT_READ)   = 0
>> mprotect(0xb7de5000, 4096, PROT_READ)   = 0
>> mprotect(0xb7da0000, 4096, PROT_READ)   = 0
>> mprotect(0xb7d97000, 4096, PROT_READ)   = 0
>> mprotect(0xb7f57000, 4096, PROT_READ)   = 0
>> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>> ...}) = 0
>> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
>> ...}) = 0
>> getpid()                                = 2933
>> getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
>> setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=RLIM_INFINITY}) = 0
>> rt_sigaction(SIGRTMIN, {0xb7d95f96, [], SA_RESTORER, 0xb7dac998}, NULL,
>> 8) = 0
>> rt_sigaction(SIGRT_1, {0xb7d95efe, [RTMIN], SA_RESTORER, 0xb7dac998},
>> NULL, 8) = 0
>> rt_sigaction(SIGRT_2, {0xb7d9562a, [], SA_RESTORER, 0xb7dac998}, NULL,
>> 8) = 0
>> rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
>> rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 8) = 0
>> --- SIGSEGV (Segmentation fault) @ 0 (0) ---
>> +++ killed by SIGSEGV +++
>>
>>
>>
>> Kind regards,
>>
>> Siamak Haschemi
>>
>> Siamak Haschemi schrieb:
>>> Hello,
>>>
>>> as you seen here (https://issues.apache.org/jira/browse/THRIFT-177), I
>>> am trying to cross-compile Thrift for the OpenWRT platform
>>> (http://openwrt.org/), which is a Linux distribution for embedded devices.
>>>
>>> After a two-night-fight, my result are the following:
>>>
>>> - I've created a OpenWRT package for thrift (see the attachment if you
>>> are interested).
>>> - I've successfully compiled the cpp-library (which results in
>>> libthrift, libthriftz and libthriftnb)
>>> - For now, I will not cross-compile the thrift-compiler since I will
>>> compile the thrift definition files on my PC.
>>>
>>> Coming to this point, I was very happy and I thought that the story
>>> ends, but now I am faced with a problem I cannot solve myself:
>>>
>>> For testing my cross-compilation result, I cross-compiled the cpp-part
>>> of the thrift tutorial. I installed the cross-compiled libraries on the
>>> target device and start the CppServer and the only reaction was
>>> "Segmentation Fault" :-(
>>>
>>>
>>> I tried to backtrack the problem and I came to the finding, that a
>>> simple hello world program, which is linked to my cross-compiled
>>> thrift-library, causes the "Segmentation Fault". Without linking the
>>> thrift-library, everything is O.K.
>>>
>>>
>>> =======================
>>> ------------
>>> Hello.cpp
>>> ------------
>>>
>>> #include <iostream>
>>>
>>> using namespace std;
>>>
>>> int main(int argc, char **argv) {
>>>   printf("Hello World!\n");
>>>   return 0;
>>> }
>>>
>>> 1) First try
>>>
>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent *-lthrift* -o Hello Hello.cpp
>>>
>>> On the target device:
>>>
>>> root@OpenWrt:~# ./Hello
>>> Segmentation fault
>>>
>>> 2) Second try
>>>
>>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent -o Hello Hello.cpp
>>>
>>> On the target device:
>>>
>>> root@OpenWrt:~# ./Hello
>>> Hello World!
>>>
>>> ======================
>>>
>>> I will try to debug it with gdb, but I'm not an expert in this.
>>>
>>>
>>> So, please, can someone help me?
>>>
>>>
>>>
>>> Kind regards,
>>>
>>> Siamak Haschemi
>>>
>>>
>>>
>>>
>>>

Re: Use Thrift in the OpenWRT platform

Posted by Siamak Haschemi <ha...@informatik.hu-berlin.de>.
Hello again,

the Hello world program without the thrift library linked shows this
strace (only the last relevant lines included):


ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
...}) = 0
brk(0)                                  = 0x88a7000
brk(0x88a8000)                          = 0x88a8000
write(1, "Hello World\n", 12Hello World
)           = 12
_exit(0)


For me, it looks like an problem with "getrlimit" or "setrlimit" function.

Lind regards,

Siamak Haschemi

Siamak Haschemi schrieb:
> Hello again,
> 
> I don't know if it helps, but here is some more information:
> 
> 
> 
> root@OpenWrt:~# ldd ./hello
>         libthrift.so.0 => /lib/libthrift.so.0 (0xb7f23000)
>         libstdc++.so.6 => /lib/libstdc++.so.6 (0xb7e68000)
>         libm.so.0 => /lib/libm.so.0 (0xb7e5b000)
>         libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7e52000)
>         libc.so.0 => /lib/libc.so.0 (0xb7e08000)
>         librt.so.0 => /lib/librt.so.0 (0xb7e05000)
>         libpthread.so.0 => /lib/libpthread.so.0 (0xb7df3000)
>         ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb7fb9000)
> 
> 
> 
> root@OpenWrt:~# strace ./hello
> execve("/bin/hello", ["/bin/hello"], [/* 8 vars */]) = 0
> mmap2(NULL, 20, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
> = 0xb7f52000
> stat("/etc/ld.so.cache", 0xbff56254)    = -1 ENOENT (No such file or
> directory)
> open("/lib/libthrift.so.0", O_RDONLY)   = 3
> fstat(3, {st_mode=S_IFREG|0755, st_size=604571, ...}) = 0
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0xb7f51000
> read(3,
> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20q\2\0004\0\0\0"...,
> 4096) = 4096
> mmap2(NULL, 606208, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
> 0xb7ebd000
> mmap2(0xb7ebd000, 591833, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
> 0) = 0xb7ebd000
> mmap2(0xb7f4e000, 10651, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
> 0x91) = 0xb7f4e000
> close(3)                                = 0
> munmap(0xb7f51000, 4096)                = 0
> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0xb7f51000
> read(3,
> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0,\0\4\0004\0\0\0"...,
> 4096) = 4096
> mmap2(NULL, 765952, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
> 0xb7e02000
> mmap2(0xb7e02000, 719316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
> 0) = 0xb7e02000
> mmap2(0xb7eb2000, 20473, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
> 0xb0) = 0xb7eb2000
> mmap2(0xb7eb7000, 23828, PROT_READ|PROT_WRITE,
> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7eb7000
> close(3)                                = 0
> munmap(0xb7f51000, 4096)                = 0
> open("/lib/libm.so.0", O_RDONLY)        = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0xb7f51000
> read(3,
> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0t\21\0\0004\0\0\0"...,
> 4096) = 4096
> mmap2(NULL, 53248, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7df5000
> mmap2(0xb7df5000, 41028, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
> 0) = 0xb7df5000
> mmap2(0xb7e00000, 4120, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
> 0xa) = 0xb7e00000
> close(3)                                = 0
> munmap(0xb7f51000, 4096)                = 0
> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0xb7f51000
> read(3,
> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0H\25\0\0004\0\0\0"...,
> 4096) = 4096
> mmap2(NULL, 36864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7dec000
> mmap2(0xb7dec000, 31592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
> 0) = 0xb7dec000
> mmap2(0xb7df4000, 3302, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
> 0x7) = 0xb7df4000
> close(3)                                = 0
> munmap(0xb7f51000, 4096)                = 0
> open("/lib/libc.so.0", O_RDONLY)        = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0xb7f51000
> read(3,
> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\251\0\0004\0\0\0"...,
> 4096) = 4096
> mmap2(NULL, 303104, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
> 0xb7da2000
> mmap2(0xb7da2000, 271528, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
> 0) = 0xb7da2000
> mmap2(0xb7de5000, 5309, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
> 0x42) = 0xb7de5000
> mmap2(0xb7de7000, 16988, PROT_READ|PROT_WRITE,
> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7de7000
> close(3)                                = 0
> munmap(0xb7f51000, 4096)                = 0
> open("/lib/librt.so.0", O_RDONLY)       = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=4110, ...}) = 0
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0xb7f51000
> read(3,
> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\344\4\0\0004\0\0\0"...,
> 4096) = 4096
> mmap2(NULL, 12288, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d9f000
> mmap2(0xb7d9f000, 2336, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
> 0) = 0xb7d9f000
> mmap2(0xb7da0000, 4110, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
> 0) = 0xb7da0000
> close(3)                                = 0
> munmap(0xb7f51000, 4096)                = 0
> open("/lib/libpthread.so.0", O_RDONLY)  = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=58930, ...}) = 0
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0xb7f51000
> read(3,
> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0004=\0\0004\0\0\0"...,
> 4096) = 4096
> mmap2(NULL, 73728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d8d000
> mmap2(0xb7d8d000, 37304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
> 0) = 0xb7d8d000
> mmap2(0xb7d97000, 22066, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
> 0x9) = 0xb7d97000
> mmap2(0xb7d9d000, 6232, PROT_READ|PROT_WRITE,
> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7d9d000
> close(3)                                = 0
> munmap(0xb7f51000, 4096)                = 0
> open("/lib/libstdc++.so.6", O_RDONLY)   = 3
> fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
> close(3)                                = 0
> open("/lib/libm.so.0", O_RDONLY)        = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
> close(3)                                = 0
> open("/lib/libc.so.0", O_RDONLY)        = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
> close(3)                                = 0
> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
> close(3)                                = 0
> open("/lib/libm.so.0", O_RDONLY)        = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
> close(3)                                = 0
> open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
> close(3)                                = 0
> open("/lib/libc.so.0", O_RDONLY)        = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
> close(3)                                = 0
> open("/lib/libc.so.0", O_RDONLY)        = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
> close(3)                                = 0
> open("/lib/libc.so.0", O_RDONLY)        = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
> close(3)                                = 0
> open("/lib/libc.so.0", O_RDONLY)        = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
> close(3)                                = 0
> open("/lib/libc.so.0", O_RDONLY)        = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
> close(3)                                = 0
> stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=16390, ...}) = 0
> mprotect(0xb7eb2000, 16384, PROT_READ)  = 0
> mprotect(0xb7e00000, 4096, PROT_READ)   = 0
> mprotect(0xb7de5000, 4096, PROT_READ)   = 0
> mprotect(0xb7da0000, 4096, PROT_READ)   = 0
> mprotect(0xb7d97000, 4096, PROT_READ)   = 0
> mprotect(0xb7f57000, 4096, PROT_READ)   = 0
> ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
> ...}) = 0
> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
> ...}) = 0
> getpid()                                = 2933
> getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
> setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=RLIM_INFINITY}) = 0
> rt_sigaction(SIGRTMIN, {0xb7d95f96, [], SA_RESTORER, 0xb7dac998}, NULL,
> 8) = 0
> rt_sigaction(SIGRT_1, {0xb7d95efe, [RTMIN], SA_RESTORER, 0xb7dac998},
> NULL, 8) = 0
> rt_sigaction(SIGRT_2, {0xb7d9562a, [], SA_RESTORER, 0xb7dac998}, NULL,
> 8) = 0
> rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
> rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 8) = 0
> --- SIGSEGV (Segmentation fault) @ 0 (0) ---
> +++ killed by SIGSEGV +++
> 
> 
> 
> Kind regards,
> 
> Siamak Haschemi
> 
> Siamak Haschemi schrieb:
>> Hello,
>>
>> as you seen here (https://issues.apache.org/jira/browse/THRIFT-177), I
>> am trying to cross-compile Thrift for the OpenWRT platform
>> (http://openwrt.org/), which is a Linux distribution for embedded devices.
>>
>> After a two-night-fight, my result are the following:
>>
>> - I've created a OpenWRT package for thrift (see the attachment if you
>> are interested).
>> - I've successfully compiled the cpp-library (which results in
>> libthrift, libthriftz and libthriftnb)
>> - For now, I will not cross-compile the thrift-compiler since I will
>> compile the thrift definition files on my PC.
>>
>> Coming to this point, I was very happy and I thought that the story
>> ends, but now I am faced with a problem I cannot solve myself:
>>
>> For testing my cross-compilation result, I cross-compiled the cpp-part
>> of the thrift tutorial. I installed the cross-compiled libraries on the
>> target device and start the CppServer and the only reaction was
>> "Segmentation Fault" :-(
>>
>>
>> I tried to backtrack the problem and I came to the finding, that a
>> simple hello world program, which is linked to my cross-compiled
>> thrift-library, causes the "Segmentation Fault". Without linking the
>> thrift-library, everything is O.K.
>>
>>
>> =======================
>> ------------
>> Hello.cpp
>> ------------
>>
>> #include <iostream>
>>
>> using namespace std;
>>
>> int main(int argc, char **argv) {
>>   printf("Hello World!\n");
>>   return 0;
>> }
>>
>> 1) First try
>>
>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent *-lthrift* -o Hello Hello.cpp
>>
>> On the target device:
>>
>> root@OpenWrt:~# ./Hello
>> Segmentation fault
>>
>> 2) Second try
>>
>> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent -o Hello Hello.cpp
>>
>> On the target device:
>>
>> root@OpenWrt:~# ./Hello
>> Hello World!
>>
>> ======================
>>
>> I will try to debug it with gdb, but I'm not an expert in this.
>>
>>
>> So, please, can someone help me?
>>
>>
>>
>> Kind regards,
>>
>> Siamak Haschemi
>>
>>
>>
>>
>>

Re: Use Thrift in the OpenWRT platform

Posted by Siamak Haschemi <ha...@informatik.hu-berlin.de>.
Hello again,

I don't know if it helps, but here is some more information:



root@OpenWrt:~# ldd ./hello
        libthrift.so.0 => /lib/libthrift.so.0 (0xb7f23000)
        libstdc++.so.6 => /lib/libstdc++.so.6 (0xb7e68000)
        libm.so.0 => /lib/libm.so.0 (0xb7e5b000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7e52000)
        libc.so.0 => /lib/libc.so.0 (0xb7e08000)
        librt.so.0 => /lib/librt.so.0 (0xb7e05000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb7df3000)
        ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb7fb9000)



root@OpenWrt:~# strace ./hello
execve("/bin/hello", ["/bin/hello"], [/* 8 vars */]) = 0
mmap2(NULL, 20, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
= 0xb7f52000
stat("/etc/ld.so.cache", 0xbff56254)    = -1 ENOENT (No such file or
directory)
open("/lib/libthrift.so.0", O_RDONLY)   = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=604571, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7f51000
read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20q\2\0004\0\0\0"...,
4096) = 4096
mmap2(NULL, 606208, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0xb7ebd000
mmap2(0xb7ebd000, 591833, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
0) = 0xb7ebd000
mmap2(0xb7f4e000, 10651, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
0x91) = 0xb7f4e000
close(3)                                = 0
munmap(0xb7f51000, 4096)                = 0
open("/lib/libstdc++.so.6", O_RDONLY)   = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7f51000
read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0,\0\4\0004\0\0\0"...,
4096) = 4096
mmap2(NULL, 765952, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0xb7e02000
mmap2(0xb7e02000, 719316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
0) = 0xb7e02000
mmap2(0xb7eb2000, 20473, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
0xb0) = 0xb7eb2000
mmap2(0xb7eb7000, 23828, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7eb7000
close(3)                                = 0
munmap(0xb7f51000, 4096)                = 0
open("/lib/libm.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7f51000
read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0t\21\0\0004\0\0\0"...,
4096) = 4096
mmap2(NULL, 53248, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7df5000
mmap2(0xb7df5000, 41028, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
0) = 0xb7df5000
mmap2(0xb7e00000, 4120, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
0xa) = 0xb7e00000
close(3)                                = 0
munmap(0xb7f51000, 4096)                = 0
open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7f51000
read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0H\25\0\0004\0\0\0"...,
4096) = 4096
mmap2(NULL, 36864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7dec000
mmap2(0xb7dec000, 31592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
0) = 0xb7dec000
mmap2(0xb7df4000, 3302, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
0x7) = 0xb7df4000
close(3)                                = 0
munmap(0xb7f51000, 4096)                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7f51000
read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\251\0\0004\0\0\0"...,
4096) = 4096
mmap2(NULL, 303104, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0xb7da2000
mmap2(0xb7da2000, 271528, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
0) = 0xb7da2000
mmap2(0xb7de5000, 5309, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
0x42) = 0xb7de5000
mmap2(0xb7de7000, 16988, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7de7000
close(3)                                = 0
munmap(0xb7f51000, 4096)                = 0
open("/lib/librt.so.0", O_RDONLY)       = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=4110, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7f51000
read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\344\4\0\0004\0\0\0"...,
4096) = 4096
mmap2(NULL, 12288, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d9f000
mmap2(0xb7d9f000, 2336, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
0) = 0xb7d9f000
mmap2(0xb7da0000, 4110, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
0) = 0xb7da0000
close(3)                                = 0
munmap(0xb7f51000, 4096)                = 0
open("/lib/libpthread.so.0", O_RDONLY)  = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=58930, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7f51000
read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0004=\0\0004\0\0\0"...,
4096) = 4096
mmap2(NULL, 73728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d8d000
mmap2(0xb7d8d000, 37304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
0) = 0xb7d8d000
mmap2(0xb7d97000, 22066, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
0x9) = 0xb7d97000
mmap2(0xb7d9d000, 6232, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7d9d000
close(3)                                = 0
munmap(0xb7f51000, 4096)                = 0
open("/lib/libstdc++.so.6", O_RDONLY)   = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=741369, ...}) = 0
close(3)                                = 0
open("/lib/libm.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
close(3)                                = 0
open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
close(3)                                = 0
open("/lib/libm.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=45080, ...}) = 0
close(3)                                = 0
open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=31974, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=275645, ...}) = 0
close(3)                                = 0
stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=16390, ...}) = 0
mprotect(0xb7eb2000, 16384, PROT_READ)  = 0
mprotect(0xb7e00000, 4096, PROT_READ)   = 0
mprotect(0xb7de5000, 4096, PROT_READ)   = 0
mprotect(0xb7da0000, 4096, PROT_READ)   = 0
mprotect(0xb7d97000, 4096, PROT_READ)   = 0
mprotect(0xb7f57000, 4096, PROT_READ)   = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo
...}) = 0
getpid()                                = 2933
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=RLIM_INFINITY}) = 0
rt_sigaction(SIGRTMIN, {0xb7d95f96, [], SA_RESTORER, 0xb7dac998}, NULL,
8) = 0
rt_sigaction(SIGRT_1, {0xb7d95efe, [RTMIN], SA_RESTORER, 0xb7dac998},
NULL, 8) = 0
rt_sigaction(SIGRT_2, {0xb7d9562a, [], SA_RESTORER, 0xb7dac998}, NULL,
8) = 0
rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 8) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++



Kind regards,

Siamak Haschemi

Siamak Haschemi schrieb:
> Hello,
> 
> as you seen here (https://issues.apache.org/jira/browse/THRIFT-177), I
> am trying to cross-compile Thrift for the OpenWRT platform
> (http://openwrt.org/), which is a Linux distribution for embedded devices.
> 
> After a two-night-fight, my result are the following:
> 
> - I've created a OpenWRT package for thrift (see the attachment if you
> are interested).
> - I've successfully compiled the cpp-library (which results in
> libthrift, libthriftz and libthriftnb)
> - For now, I will not cross-compile the thrift-compiler since I will
> compile the thrift definition files on my PC.
> 
> Coming to this point, I was very happy and I thought that the story
> ends, but now I am faced with a problem I cannot solve myself:
> 
> For testing my cross-compilation result, I cross-compiled the cpp-part
> of the thrift tutorial. I installed the cross-compiled libraries on the
> target device and start the CppServer and the only reaction was
> "Segmentation Fault" :-(
> 
> 
> I tried to backtrack the problem and I came to the finding, that a
> simple hello world program, which is linked to my cross-compiled
> thrift-library, causes the "Segmentation Fault". Without linking the
> thrift-library, everything is O.K.
> 
> 
> =======================
> ------------
> Hello.cpp
> ------------
> 
> #include <iostream>
> 
> using namespace std;
> 
> int main(int argc, char **argv) {
>   printf("Hello World!\n");
>   return 0;
> }
> 
> 1) First try
> 
> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent *-lthrift* -o Hello Hello.cpp
> 
> On the target device:
> 
> root@OpenWrt:~# ./Hello
> Segmentation fault
> 
> 2) Second try
> 
> $ i386-linux-uclibc-g++ -L${LIB_DIR} -levent -o Hello Hello.cpp
> 
> On the target device:
> 
> root@OpenWrt:~# ./Hello
> Hello World!
> 
> ======================
> 
> I will try to debug it with gdb, but I'm not an expert in this.
> 
> 
> So, please, can someone help me?
> 
> 
> 
> Kind regards,
> 
> Siamak Haschemi
> 
> 
> 
> 
>