Debugging 我可以阻止调试器进入Boost或STL头文件吗? < >我使用Qt Creator与GDB在Linux平台上调试我的C++代码。每当我使用boost::shared_ptr或类似工具时,调试器都会进入包含boost实现的头文件(即/usr/include/boost/shared_ptr.hpp)。我想在调试方面忽略这些文件,只需跳过它们。我知道我可以在它到达其中一个文件时立即退出,但是如果不在每个调试会话中进行多次调试,那么调试就会容易得多

Debugging 我可以阻止调试器进入Boost或STL头文件吗? < >我使用Qt Creator与GDB在Linux平台上调试我的C++代码。每当我使用boost::shared_ptr或类似工具时,调试器都会进入包含boost实现的头文件(即/usr/include/boost/shared_ptr.hpp)。我想在调试方面忽略这些文件,只需跳过它们。我知道我可以在它到达其中一个文件时立即退出,但是如果不在每个调试会话中进行多次调试,那么调试就会容易得多,debugging,gcc,boost,gdb,qt-creator,Debugging,Gcc,Boost,Gdb,Qt Creator,我正在使用gcc编译器(g++),它运行在OpenSuSE Linux 11.2上,带有QtCreator 2.2(它使用gdb作为调试器) 编辑添加:这个问题是针对Boost文件的,但也可能适用于STL文件 您可以 b在要停止的函数的第一行(b Class::method或b file.cpp:line), 然后c gdb将绕过boost代码,并在b中给出的点(您需要它的地方)中断 这是可行的,但可能看起来很乏味。这是习惯问题。重复会变得更容易 msvc的行为类似于gdbgdb是可编写脚本的。

我正在使用gcc编译器(
g++
),它运行在OpenSuSE Linux 11.2上,带有QtCreator 2.2(它使用
gdb
作为调试器)

编辑添加:这个问题是针对Boost文件的,但也可能适用于STL文件

您可以
b在要停止的函数的第一行(b Class::method或b file.cpp:line),
然后c

gdb将绕过boost代码,并在b中给出的点(您需要它的地方)中断

这是可行的,但可能看起来很乏味。这是习惯问题。重复会变得更容易


msvc的行为类似于gdb

gdb是可编写脚本的。它有while、if、变量、shell子命令、用户定义函数(define)等。它有用于编写脚本的python接口

通过一点工作,您可以按照以下方式创建gdb脚本:

define step-bypass-boost
  step
  while 1
    use "info source", put current source file into variable
    if source file does not match */boost/* then
        break-loop
    end
    step
  end
end

或者查找是否有人已经在没有进入STL和/usr中的所有其他库的情况下制作了这样的脚本

GDB:

将以下内容放入
.gdbinit
文件中。它搜索gdb已加载或可能加载的源(gdb命令<代码>信息源),并在其绝对路径以“/usr”开头时跳过它们。它连接到
run
命令,因为执行该命令时可能会重新加载符号

# skip all STL source files
define skipstl
python
# get all sources loadable by gdb
def GetSources():
    sources = []
    for line in gdb.execute('info sources',to_string=True).splitlines():
        if line.startswith("/"):
            sources += [source.strip() for source in line.split(",")]
    return sources

# skip files of which the (absolute) path begins with 'dir'
def SkipDir(dir):
    sources = GetSources()
    for source in sources:
        if source.startswith(dir):
            gdb.execute('skip file %s' % source, to_string=True)

# apply only for c++
if 'c++' in gdb.execute('show language', to_string=True):
    SkipDir("/usr")
end
end

define hookpost-run
    skipstl
end
要检查要跳过的文件列表,请在某处设置断点(例如,
breakmain
)并运行gdb(例如,
run
),然后在到达断点时检查
信息源

(gdb) info skip
Num     Type           Enb What
1       file           y   /usr/include/c++/5/bits/unordered_map.h
2       file           y   /usr/include/c++/5/bits/stl_set.h
3       file           y   /usr/include/c++/5/bits/stl_map.h
4       file           y   /usr/include/c++/5/bits/stl_vector.h
...
通过从以下位置添加对
SkipDir()

的调用,可以很容易地将其扩展为跳过其他目录:

我也有同样的需要。我扩展了gdb中的'skip'命令,以支持新类型'dir'。我现在可以在gdb中执行此操作:

skip dir /usr
然后,我从来没有停止在我的任何第三方标题


这是一个网页,其中包含此信息+修补程序(如果有帮助的话):

这个怎么样?:@状态,谢谢。这个问题让人觉得这是不可能的,至少是自动的,除非目标代码和动态库代码之间存在差异。不幸的是,这个解决方案适用于gcc,但不适用于icc16。无论如何,谢谢你!