告诉 gdb 在步进时跳过 _only_ std

Tell gdb to skip _only_ std when stepping

this question中所述,我想在步进时跳过所有std函数。制作 skip -rfu "std::.*" 有点效果,但有时太粗糙了。

假设我有这样的代码:

auto p = std::make_shared<Something>(yadda yadda); 

启用跳过后,即使 Something 的构造函数不平凡,step 也会跳过整行。当我尝试进入 std::function 实例的调用时出现同样的问题。

是否可以只跳过 std,而不是整个调用链(如果其中有来自 std 的内容?

Is it possible to skip only std, not entire callchain if there is something from std in it?

效率不高。

想想实现它需要什么。您将不得不一次单步执行一条指令,并查看每条指令的函数名称以决定它是否应该被跳过。

可以内联的 C++11 lambda 可能会使情况变得更糟——lambda 可以内联到 std::... 函数中,但可以说不应该匹配 std::.*.

那么这可以工作吗? -- 大概。

它真的有用吗? -- 可能很少见。

This answer 建议对 gdb 使用 python 脚本功能。所以我设法构建了这个大部分时间对我有用的有点混乱的脚本(尽管有时它需要一两步才能退出 ASAN 程序集):

import gdb
import re

def stop_handler(event):
    frame_name = gdb.selected_frame().name()
    if re.search("(^std::.*)|(^boost::.*)|(^__gnu_cxx::.*)|(^__sanitizer::.*)|(^__ubsan::.*)", frame_name) != None:
        gdb.execute("step")
        return
    
    symtab = gdb.selected_frame().find_sal().symtab
    fullname = symtab.fullname()

    matches = ["libsanitizer", "sysdeps", "/usr/include/", "ubsan"]
    if any(x in fullname for x in matches):
        gdb.execute("step")
        return

    objfile = symtab.objfile.filename

    if "libubsan.so" in objfile:
        gdb.execute("step")
        return

gdb.events.stop.connect(stop_handler)   

我正在使用 Clion,这个脚本使它在单步执行文件时确实快速闪烁,所以我想注意闪烁的危险