告诉 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,这个脚本使它在单步执行文件时确实快速闪烁,所以我想注意闪烁的危险
如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,这个脚本使它在单步执行文件时确实快速闪烁,所以我想注意闪烁的危险