mmm*_*mmm 5 c++ gdb variadic-templates c++11
如何在gdb中的可变参数函数中看到参数包的值?
示例代码(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);
}
Run Code Online (Sandbox Code Playgroud)
编译
g++ --std=c++11 -O0 -g VariadicDebug.cpp
Run Code Online (Sandbox Code Playgroud)
并运行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
Run Code Online (Sandbox Code Playgroud)
正如你所看到的:它只给出了一个不用于ts的值.
在MSYS2上编辑: gdb:7.9,g ++:4.9.2
编辑:ubuntu 15.04(g ++:4.9.2,gdb:7.9,binutils:2.25)给出相同的结果
编辑:objdump - 调试导致:
<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
Run Code Online (Sandbox Code Playgroud)
似乎参数在这里(最后两个DW_TAG_formal_parameter)但没有它们各自的名字!
编辑:使用-c进行编译并在生成的.o文件上运行objdump也会提供相同的输出.这是否意味着我的g ++做错了?(我很感激不能自己编译:-))
在 gdb 中始终有效的一个技巧是在扩展变量时按 Tab 键!
所以如果你输入:
gdb > 打印 ts选项卡
你得到
ts#0
ts#1
所以要打印您的变量,您只需使用:
gdb > 打印 'ts#1'
在这里使用单引号很重要!
还
gdb > 信息参数
给我吗:
a=0
ts#0 = 0x400d06 "Hello world!"
ts#1 = 88,900000000000006
gdb 版本为:7.9.1,编译器为 5.2.0
按照要求:
我用旧的 4.9.2 gcc 编译 aslo 并运行过时的 gdb 7.7。对我来说同样的结果,它也像这里解释的那样工作!
编辑:要找出问题与哪一侧(编译器与 gdb )有关,您可以尝试手动读出调试信息:
备注:我将函数名称更改为“FindItEasy”并将参数更改为“First/Rest”,这样我就可以在这里搜索不到 2 个字母了 :-)
objdump --调试
<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>
Run Code Online (Sandbox Code Playgroud)
您也许可以尝试在您的文件中找到调试信息。
提示:拥有 gdb 和 gcc 版本并不是完整的事实。这两个工具都建立在 binutils 之上。如果 binutils 已过时,则某些调试信息(如 dwarf 格式)可能不完整)。也许你可以检查一下!
| 归档时间: |
|
| 查看次数: |
591 次 |
| 最近记录: |