告诉gdb跳过标准文件

时间:2011-04-15 11:48:58

标签: c++ gdb

我正在使用GDB调试C ++代码,当它进入包含标准库对象的某个对象的构造函数时,它会向我显示这些对象的构造函数(如std::map)以及下面的所有内容。

我知道next运算符,但我更倾向于将任何标准库代码基本列入黑名单,这绝不是我正在调查的错误的来源。希望的行为是简单的skip会将我发送到下一个“用户土地”代码。

4 个答案:

答案 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()

Known bugs

  1. it doesn't interrupt debugger on SIGINT while running;
  2. changed pass to break on exception as not sure whether it is right.