Display package parameter values ​​in gdb

How can I see the values ​​of a parameter package in a variational function in gdb?

Sample code (VariadicDebug.cpp):

template <typename... Ts> int Do(int a, Ts... ts) { // Add breakpoint here. a can be seen using 'print a' but how to show ts??? return a; } int main(int argc, char **argv) { return Do(0, "Hello world!", 88.9); } 

Compile with

 g++ --std=c++11 -O0 -g VariadicDebug.cpp 

And run gdb:

 $ gdb ./a.exe GNU gdb (GDB) 7.9 Copyright (C) 2015 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 "x86_64-pc-msys". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ./a.exe...done. (gdb) break VariadicDebug.cpp:4 Breakpoint 1 at 0x100401760: file VariadicDebug.cpp, line 4. (gdb) run Starting program: /c/Data/tests/a.exe [New Thread 8008.0x1dd0] [New Thread 8008.0x2898] [New Thread 8008.0x26f0] [New Thread 8008.0x1498] Breakpoint 1, Do<char const*, double> (a=0) at VariadicDebug.cpp:4 4 return a; (gdb) info args a = 0 

As you can see: the value of a is only for ts .

EDIT: gdb: 7.9, g ++: 4.9.2 on MSYS2

EDIT : ubuntu 15.04 (g ++: 4.9.2, gdb: 7.9, binutils: 2.25) gives the same result

EDIT : objdump --debugging led to:

  <1><81>: Abbrev Number: 7 (DW_TAG_subprogram) <82> DW_AT_external : 1 <82> DW_AT_name : (indirect string, offset: 0x0): FindItEasy<char const*, double> <86> DW_AT_decl_file : 1 <87> DW_AT_decl_line : 1 <88> DW_AT_linkage_name: (indirect string, offset: 0x3a): _Z10FindItEasyIIPKcdEEiiDpT_ <8c> DW_AT_type : <0x67> <90> DW_AT_low_pc : 0x400529 <98> DW_AT_high_pc : 0x15 <a0> DW_AT_frame_base : 1 byte block: 9c (DW_OP_call_frame_cfa) <a2> DW_AT_GNU_all_call_sites: 1 <a2> DW_AT_sibling : <0xdc> <2><a6>: Abbrev Number: 8 (DW_TAG_GNU_template_parameter_pack) <a7> DW_AT_name : Ts <aa> DW_AT_sibling : <0xb9> <3><ae>: Abbrev Number: 9 (DW_TAG_template_type_param) <af> DW_AT_type : <0xdc> <3><b3>: Abbrev Number: 9 (DW_TAG_template_type_param) <b4> DW_AT_type : <0xe7> <3><b8>: Abbrev Number: 0 <2><b9>: Abbrev Number: 3 (DW_TAG_formal_parameter) <ba> DW_AT_name : (indirect string, offset: 0x20): first <be> DW_AT_decl_file : 1 <bf> DW_AT_decl_line : 1 <c0> DW_AT_type : <0x67> <c4> DW_AT_location : 2 byte block: 91 6c (DW_OP_fbreg: -20) <2><c7>: Abbrev Number: 10 (DW_TAG_GNU_formal_parameter_pack) <c8> DW_AT_decl_file : 1 <c9> DW_AT_decl_line : 1 <3><ca>: Abbrev Number: 11 (DW_TAG_formal_parameter) <cb> DW_AT_type : <0xdc> <cf> DW_AT_location : 2 byte block: 91 60 (DW_OP_fbreg: -32) <3><d2>: Abbrev Number: 11 (DW_TAG_formal_parameter) <d3> DW_AT_type : <0xe7> <d7> DW_AT_location : 2 byte block: 91 58 (DW_OP_fbreg: -40) <3><da>: Abbrev Number: 0 <2><db>: Abbrev Number: 0 

It seems that the arguments are here (last two DW_TAG_formal_parameter), but without their corresponding names!

EDIT : compiling with -c and running objdump in the generated .o file also gives the same result. So does this mean that my g ++ is doing it wrong? (I would appreciate it if he did not compile it himself :-))

+5
source share
1 answer

The trick that always works in gdb is to click a tab when expanding vars!

So, if you type:

gdb> print tab ts

You are getting

ts#0 ts#1

so to print your variable you just use:

gdb> print 'ts # 1'

It is important to use single quotes here!

Also

gdb> info args

give me:

a=0 ts#0 = 0x400d06 "Hello world!" ts#1 = 88,900000000000006

gdb version: 7.9.1, compiler - 5.2.0

According to the request:

I compiled with older 4.9.2 gcc and ran legacy gdb 7.7. The same results for me, it works the same as explained here!

EDIT: To find out which side (the compiler versus gdb) is the problem, you can try to read the debugging information manually:

Note. I changed my function name to "FindItEasy" and parms to "First / Rest" so that I can look for more than 2 letters here :-)

objdump --debugging

  <158> DW_AT_name : (indirect string, offset: 0x18d): FindItEasy <15c> DW_AT_decl_file : 1 <15d> DW_AT_decl_line : 14 <15e> DW_AT_prototyped : 1 <15e> DW_AT_low_pc : 0x400b6f <166> DW_AT_high_pc : 0x37 <16e> DW_AT_frame_base : 1 byte block: 9c (DW_OP_call_frame_cfa) <170> DW_AT_GNU_all_call_sites: 1 <170> DW_AT_sibling : <0x1f8> <2><174>: Abbrev Number: 7 (DW_TAG_formal_parameter) <175> DW_AT_name : (indirect string, offset: 0x59): first <179> DW_AT_decl_file : 1 <17a> DW_AT_decl_line : 14 <17b> DW_AT_type : <0x34> <17f> DW_AT_location : 0xbe (location list) <2><183>: Abbrev Number: 7 (DW_TAG_formal_parameter) <184> DW_AT_name : (indirect string, offset: 0x66): rest#0 <188> DW_AT_decl_file : 1 <189> DW_AT_decl_line : 14 <18a> DW_AT_type : <0x6c> <18e> DW_AT_location : 0x10a (location list) <2><192>: Abbrev Number: 7 (DW_TAG_formal_parameter) <193> DW_AT_name : (indirect string, offset: 0x6d): rest#1 <197> DW_AT_decl_file : 1 <198> DW_AT_decl_line : 14 <199> DW_AT_type : <0x2d> <19d> DW_AT_location : 0x169 (location list) <2><1a1>: Abbrev Number: 8 (DW_TAG_GNU_call_site) <1a2> DW_AT_low_pc : 0x400b89 <1aa> DW_AT_abstract_origin: <0x408> <1ae> DW_AT_sibling : <0x1ba> 

You might want to find debugging information in your file.

Hint: having a version of gdb and gcc is not completely true. Both tools are installed on top of binutils. And if binutils are deprecated, it is possible that some debugging information (for example, the dwarf format) is incomplete). Maybe you can check it out!

+3
source

All Articles