adres ze stacktrejsa

0

Witam
gdbem próbuje zdebugować w którym miejscu kodu aplikacja zgłasza segmentation faulta. Na razie zdebugowałem tyle, że ten bład wyskakuje gdy wywoływania jest metoda assing z klasy string i parametr jej przekazywany to funkcja strlen z parametrem NULL. Wtedy wywołuje się segmentation fault. Niestety nie umiem znaleźć dalszych metod na stosie które wywołują metodę assign. Ale za to mam adres 0x0f68aec8. Oprócz binarki przy kompilacji mejkem utowrzyła się tez mapa. Czy da radę coś tu zdziałać by zdekodować jakie wywołanie jest pod adresem 0x0f68aec8?

(gdb) file binarka
Reading symbols from /var/fpwork/myCatalog/aaa/cgdb/binarka...done.
(gdb) target remote 10.44.142.163:443
Remote debugging using 10.44.142.163:443
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0x4ab78ac0 in ?? ()
(gdb) info shared
No shared libraries loaded at this time.
(gdb) set sysroot remote:/
Reading symbols from remote:/lib/ld-linux.so.3...(no debugging symbols found)...                                                                                                                               done.
Loaded symbols for remote:/lib/ld-linux.so.3
(gdb) c
Continuing.
[New Thread 7603]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 7603]
0x4ac47d64 in strlen () from remote:/lib/libc.so.6
(gdb) bt
#0  0x4ac47d64 in strlen () from remote:/lib/libc.so.6
#1  0xb6d83eb8 in std::string::assign(char const*) ()
   from remote:/lib/libstdc++.so.6
#2  0x0f68aec8 in ?? ()
#3  0x0f68aec8 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
0

Tak da się, pod warunkiem, że masz pliki z symbolami dla tego build'a.
Przykładowo na mac os jest narzędzie atos:

atos -o plikZSymbolami -l 0x107052000 0x000000010760b603 0x00000001075e7e3b 0x00000001075e1f47 >Decoded.txt

gdzie 0x107052000 to adres załadowania biblioteki (aplikacji), a inne wartości to adresy symboli, którymi byłem zainteresowany.

https://sourceware.org/binutils/docs/binutils/addr2line.html

Z drugiej strony źle zbudowałeś aplikację, bez informacji dla debugger-a.

0

Ta apka to z pracy a tu jest dość rozbudowany system make'ów. W każdym razie wydaje mi się że w każdym mejku dodałem flagę -g.
A da rade coś takiego zrobić by w konsoli przy wywoływaniu budowania poinformowac kompilator że chce dodac jakąś jeszcze flagę? wtedy dla pewności mógłbym tutaj dodac jeszcze "-g".
make TGT=BINAR -g (dodaj jeszcze flage -g do istniejących zdefiniowanych w mejkach)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0