Debugging with GDB已经有一份中文翻译,在这边中文翻译的基础上将文档中新增的部分以及没有翻译的后继部分进行翻译,对gdb达到一个质的应用。
这是第10部分的选出来的一些技巧
10.4 模糊表达式
表达式有时会包含一些模糊的元素。例如,一些编程语言(特别是Ada,C++和Objective-C语言)允许一个简单的函数名在不同的语境中被定义多次。
这就是所谓的重载。涉及Ada的另一个例子是通用的。一个普通包类似C++模板以及可以被实例化多次,导致在相同的函数名在不同的上下文中被定义。
在某些情况下,根据语言,它是可能删除一些模糊的地方来调整表达。比如在C++中,你可以指定想要下断点的函数特征,比如在function(types)处下断点。
在Ada,使用完整的函数名通常使得表达式不会模糊。
当检测到模糊的地方需要加以解决,调试器有能力来显示每一个可能的选项,然后等待提示符'>'的选择。第一个选项始终是'[0] cancel',并键入
0<RET>来中止当前命令。如果在其中表达的命令允许选择一个以上的选项,在旁边的菜单选项是'[1] all',并键入1 <RET>,选择所有可能的选择。
例如,下面例子显示试图重载的String::after后设置一个断点。我们选择了三个特别的函数名定义:
(gdb) b String::after
[0] cancel
[1] all
[2] file:String.cc; line number:867
[3] file:String.cc; line number:860
[4] file:String.cc; line number:875
[5] file:String.cc; line number:853
[6] file:String.cc; line number:846
[7] file:String.cc; line number:735
> 2 4 6
Breakpoint 1 at 0xb26c: file String.cc, line 867.
Breakpoint 2 at 0xb344: file String.cc, line 875.
Breakpoint 3 at 0xafcc: file String.cc, line 846.
Multiple breakpoints were set.
Use the "delete" command to delete unwanted
breakpoints.
(gdb)
set multiple-symbols mode
此选项允许当出现一个模糊表达式的时候调整调试器的行为。
默认情况下,mode设置为all。如果表达式中使用该命令来允许多个选择,然后GDB自动选择所有可能的选择。例如,插入一个使用模糊的名称的函数断点,
会在每一个可能的匹配函数中插入一个断点。但是,如果必须作出一个唯一的选择,那么GDB使用菜单来帮助你消除有歧义的表达式。例如,在使用的菜单中打印重载函数的地址
当模式设置为ask,调试器发现模糊表达式的时候总是会使用菜单
最后,当模式设置为cancel,调试器会报告模糊表达式的错误并且中止命令。
show multiple-symbols
显示多符号设置的当前值。