in gdb

2016-04-04 23 views
4

Ich versuche, das folgende einfache Programm zu debuggen:in gdb

#include <iostream> 

template <class... Args> 
void printAll(Args&&... args) { 
    using swallow = int[]; 
    swallow{0, 
     (std::cout << args, 0)... 
    }; 
} 

int main() { 
    printAll(1, "23", 4); 
} 

Zusammengestellt mit gcc 4.9.2 mit:

g++ -std=c++11 -g -O0 foo.cxx 

Und dann Debugging mit GDB 7.9 verwenden:

gdb a.out 

(gdb) break foo.cxx:5 
Breakpoint 1 at 0x400884: file foo.cxx, line 5. 
(gdb) run 
Starting program: /..[snip]../a.out 

Breakpoint 1, printAll<int, char const (&) [3], int>(int&&, char const (&) [3], int&&)() at foo.cxx:6 
6  swallow{0, 
(gdb) bt 
#0 printAll<int, char const (&) [3], int>(int&&, char const (&) [3], int&&)() at foo.cxx:6 
#1 0x0000000000400813 in main() at foo.cxx:12 

ich bin in der richtigen Funktion, aber ich habe keine Möglichkeit, die Parameter zu inspizieren:

(gdb) info args 
No arguments. 
(gdb) print args 
No symbol "args" in current context. 
(gdb) inspect args 
No symbol "args" in current context. 

Wie überprüfe ich tatsächlich die Argumente?

Antwort

3

Verwandte: Showing values of parameters packs in gdb

Es gibt zwei Probleme; Die erste besteht darin, dass g ++ Parameterpaket-Debugging-Informationen im DWARF-Format unter Verwendung der Tags DW_TAG_GNU_template_parameter_pack and DW_TAG_GNU_formal_parameter_pack, die gdb does not yet support (patch attached) ist, ausgibt.

Auch wenn dies behoben ist, stoßen wir auf ein anderes Problem, nämlich dass die Debugging-Informationen, die g ++ ausgibt, gebrochen sind; es ist missing the parameter name (DW_AT_name) (patch attached).

TBH gdb Unterstützung für C++ 11 ist ziemlich abgründig (nicht überraschend, wie es effektiv so lange aufgegeben wurde); Ein weiterer Fehler fast-showstopper für C++ 11 ist, dass es doesn't support rvalue references (DW_TAG_rvalue_reference_type) (patch attached), Drucken von Fehlermeldungen wie <unknown type in /tmp/a.out, CU 0x0, DIE 0x7f>.

die Problemumgehung (andere als die Verwendung von Klappern oder eine alte Version von g ++, die nicht die DW_TAG_GNU_template_parameter_pack Tags nicht verwendet, zB 4.4.7) ist die stabs debugging format with GCC extensions zu verwenden:

g++ -std=c++11 -gstabs+ -O0 foo.cxx 

(gdb) s 
void printAll<int, char const (&) [3], int>(int, int&&, char const (&) [3], int&&) (i=999, args#[email protected]: 1, args#1=..., args#[email protected]: 4) 
    at p.cpp:7 
7  swallow{0, 
(gdb) p 'args#0' 
$1 = (int &) @0x7fffffffe45c: 1 
+0

Funktioniert! Und ist * herrlich * dunkel. Es scheint, als hätte OP in dieser anderen Frage nicht wirklich das bekommen, was er von der verknüpften Antwort wollte? Denken Sie, wir sollten diesen als einen Betrogenen von diesem schließen? – Barry

+0

Mit Links aktualisiert, um Tracker zu veröffentlichen, mit Patches. – ecatmur

+1

@Barry gute Idee, ich habe getan, wie Sie vorgeschlagen. – ecatmur