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.0gdb --version
: 7.7.1- Code Abhängigkeiten: boost und opencv
hast du die ausführbare Datei "entkleistert"? Dies entfernt Debug-Informationen. –
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? –
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