2016-04-02 8 views
0

Ich arbeite an einer ziemlich großen C++ - App, wobei der größte Teil des Codes in einer statischen Bibliothek gespeichert ist, und einige Programme, die diesen Code verwenden. Ich habe, was wie ein Speicherfehler Laufzeit Absturz aussieht:Debugging: Meine Symbole werden nicht in gdb geladen?

*** Error in `build/bin/myapp': malloc(): memory corruption (fast): 0x00000000021f62a0 *** 

ich überprüfen möchten, wo das passiert. GDB scheint das richtige Werkzeug zu sein (OS: Ubuntu 14.04).

Meine Makefiles behandeln Debug und Release mit einem Makefile-Befehlszeilenschalter.

Mit dem Einschalten wird das Flag -g hinzugefügt und die .a-Bibliothek ist 23,8 MB, während die App 519 kB ist. Ohne, seine 1,6 MB und 486kB (so bin ich mir ziemlich sicher, die Debugging-Symbole sind dort).

Mein (teilweise) CFLAGS, wie sie in der gcc manual vorgeschlagen: CFLAGS = -std=c++11 -g -Wall -O0 -fno-inline

betreibe ich gdb mit:

gdb --args build/bin/myapp Messdatei.dat -a -b (... und mehr Argumente)

Mein Problem ist, dass auch in dem Debug-Build, hält gdb mir zu sagen, dass es keine Symbole finden:

Lesen von Symbolen aus Build/bin/myapp ... (keine Debugging-Symbole gefunden) ... fertig.

Wenn ich es von innen gdb laufen, stürzt es mit:

Program received signal SIGABRT, Aborted. 
0x00007ffff5298cc9 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 

Und der backtrace Befehl zeigt in der Tat, dass die Symbole fehlen: Frames 10 bis 18 Informationen haben fehlen, und sind wahrscheinlich im Zusammenhang mit meiner Code:

(gdb) bt 
#0 0x00007ffff5298cc9 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
#1 0x00007ffff529c0d8 in __GI_abort() at abort.c:89 
#2 0x00007ffff52d5394 in __libc_message ([email protected]=1, [email protected]=0x7ffff53e3b28 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:175 
#3 0x00007ffff52e00f7 in malloc_printerr (action=<optimized out>, str=0x7ffff53e3ec8 "malloc(): memory corruption (fast)", ptr=<optimized out>) at malloc.c:4996 
#4 0x00007ffff52e2e04 in _int_malloc (av=0x7ffff5620760 <main_arena>, bytes=36) at malloc.c:3359 
#5 0x00007ffff52e47b0 in __GI___libc_malloc (bytes=36) at malloc.c:2891 
#6 0x00007ffff5babe68 in operator new(unsigned long)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#7 0x00007ffff5c03e69 in std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#8 0x000000000045a7a5 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag)() 
#9 0x00007ffff5c05bd6 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)() 
    from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#10 0x000000000042df7f in ??() 
#11 0x000000000042eef6 in ??() 
#12 0x0000000000421dab in ??() 
#13 0x0000000000422223 in ??() 
#14 0x0000000000422cfe in ??() 
#15 0x0000000000423393 in ??() 
#16 0x0000000000424600 in ??() 
#17 0x000000000040fd50 in ??() 
#18 0x000000000040566d in ??() 
#19 0x00007ffff5283ec5 in __libc_start_main (main=0x4053c0, argc=6, argv=0x7fffffffddf8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, 
    stack_end=0x7fffffffdde8) at libc-start.c:287 
#20 0x000000000040604f in ??() 

habe ich manyquestionsabout dieses Thema einige the überprüfen, aber keine jede Hilfe (die meisten dieser r Elate zu einer vergessenen -g Flagge, oder addierte -s, die Symbole abziehend).

Frage: Was kann der nächste Schritt sein, um herauszufinden, warum/wo mein Unfall passiert?

Zusätzliche Informationen:

  • gcc --version: 5.3.0
  • gdb --version: 7.7.1
  • Code Abhängigkeiten: boost und opencv
+0

hast du die ausführbare Datei "entkleistert"? Dies entfernt Debug-Informationen. –

+2

Schauen Sie sich die Ausgabe von 'make' an, es zeigt alle Befehle an, die mit allen Flags ausgeführt werden. Zeigt es beim Bauen die '-g'-Flagge an? Es zeigt nicht die "-s" -Flag beim Verlinken? Oder mit dem 'strip' Befehl? –

+0

Danke Jungs, aber jeder Build-Schritt wird in der Konsole protokolliert, und ** ja **, es ist völlig in Ordnung, -g und nein -s, ich habe das zuerst überprüft (siehe meine CFLAGS). – kebs

Antwort

1

aber keine jede Hilfe (die meisten Diese beziehen sich auf eine vergessene -g-Flagge oder eine hinzugefügte -s, die die Symbole abstreift.

Es ist fast sicher, dass Sie entweder ein verirrtes -s irgendwo auf der Verbindungslinie haben, oder Sie laufen stip auf dem binären während der Installation.

Schauen Sie auf Ihre Link-Befehlszeile und installieren Sie den Befehl sorgfältig, da ist Streifen irgendwo dort.

P.S. Wie Tom Tromey bereits sagte, ist GDB nur selten effektiv bei einem solchen Problem. Mit Valgrind oder Address Sanitizer werden Sie wahrscheinlich viel schneller zur Ursache kommen.

+0

Danke, wie ich im Kommentar erklärt habe, das war in der Tat das Problem und, ja, Valgrind ist auch hilfreich, gdb gab mir den Ort des Absturzes, aber Valgrind lieferte ein bisschen mehr Informationen . – kebs

Verwandte Themen