我正在使用GDB调试C ++代码,当它进入包含标准库对象的某个对象的构造函数时,它会向我显示这些对象的构造函数(如std::map
)以及下面的所有内容。
我知道next
运算符,但我更倾向于将任何标准库代码基本列入黑名单,这绝不是我正在调查的错误的来源。希望的行为是简单的skip
会将我发送到下一个“用户土地”代码。
答案 0 :(得分:11)
* GDB 7.4中的更改
- GDB现在允许您在使用“跳过功能”和“跳过文件”命令踩踏时跳过不感兴趣的功能和文件。
答案 1 :(得分:7)
gdb 7.12支持文件通配以指定要在调试器中跳过的文件。相同的文档如下:
https://sourceware.org/gdb/onlinedocs/gdb/Skipping-Over-Functions-and-Files.html
要跳过目录/ usr / include / c ++ / 5 / bits中的所有库头,请将以下行添加到〜/ .gdbinit
# To skip all .h files in /usr/include/c++/5/bits
skip -gfi /usr/include/c++/5/bits/*.h
而不是跳过特定文件,比如stl_vector.h,将以下行添加到〜/ .gdbinit
# To skip the file /usr/include/c++/5/bits/stl_vector.h
skip file /usr/include/c++/5/bits/stl_vector.h
使用gdb 7.11及以下版本执行上述操作会导致以下错误:
Ignore function pending future shared library load? (y or [n]) [answered N; input not from terminal]
但是,gdb 7.12似乎解决了上述问题。
此blog解决了gdb版本7.11或更低版本的相同问题。
注意 - 您可以使用gdb命令提示符中的以下命令列出标记为跳过的所有文件
info skip
答案 2 :(得分:1)
分步说明并跳过所有没有来源的文件
对于大多数应用程序来说这太慢了,但很有趣!
基于:Displaying each assembly instruction executed in gdb
class ContinueUntilSource(gdb.Command):
def __init__(self):
super().__init__(
'cus',
gdb.COMMAND_BREAKPOINTS,
gdb.COMPLETE_NONE,
False
)
def invoke(self, argument, from_tty):
argv = gdb.string_to_argv(argument)
if argv:
gdb.write('Does not take any arguments.\n')
else:
done = False
thread = gdb.inferiors()[0].threads()[0]
while True:
message = gdb.execute('si', to_string=True)
if not thread.is_valid():
break
try:
path = gdb.selected_frame().find_sal().symtab.fullname()
except:
pass
else:
if os.path.exists(path):
break
ContinueUntilSource()
在Ubuntu 16.04,GDB 7.11中测试。 GitHub upstream
答案 3 :(得分:0)
Modified from Ciro Santilli's answer command ss
steps inside specific source. You may specify source file name or the current one will be stepped. Very handy for stepping through bison/yacc sources or other meta-sources that generate С code and insert #line
directives.
import os.path
class StepSource(gdb.Command):
def __init__(self):
super().__init__(
'ss',
gdb.COMMAND_BREAKPOINTS,
gdb.COMPLETE_NONE,
False
)
def invoke(self, argument, from_tty):
argv = gdb.string_to_argv(argument)
if argv:
if len(argv) > 1:
gdb.write('Usage:\nns [source-name]]\n')
return
source = argv[0]
full_path = False if os.path.basename(source) == source else True
else:
source = gdb.selected_frame().find_sal().symtab.fullname()
full_path = True
thread = gdb.inferiors()[0].threads()[0]
while True:
message = gdb.execute('next', to_string=True)
if not thread.is_valid():
break
try:
cur_source = gdb.selected_frame().find_sal().symtab.fullname()
if not full_path:
cur_source = os.path.basename(cur_source)
except:
break
else:
if source == cur_source:
break
StepSource()
pass
to break
on exception as not sure whether it is right.