如何调用感兴趣的gdb打印函数,根据堆栈的深度缩进?
我希望能够说出(制作):
(gdb) trace Foo* Bar* printf
Run Code Online (Sandbox Code Playgroud)
并让gdb打印所有以Foo或Bar开头的函数,因为它们被调用.有点像gnu cflow,除了使用调试符号和仅实际调用的打印函数,而不是所有可能的调用流.
无法帮助的工具包括cachegrind,callgrind和oprofile,它们最常调用函数的结果.我需要保留的调用顺序.
通配符(或等效的)是必不可少的,因为有很多Foo和Bar函数.虽然我愿意完全记录所有功能.或者,也许告诉gdb记录特定库中的所有函数.
某些GDB向导必须有一个用于此常见作业的脚本!
我一直试图找到一种方法来自动化GDB中跟踪程序控制流程的进度.
即使只是一种自动执行n命令的简单方法,您也可以查看调用例程的顺序.
我意识到你可以发出n xx是GDB逐步执行的次数的问题,但问题在于它显示的是命令而不是例程的地址!但是如果你n在GDB中手动按下(然后按回车键发出上一个命令),它会显示地址.
我在GDB中尝试了以下内容:
(after setting a breakpoint at say 0x0123456)
b *0x0123456
Run Code Online (Sandbox Code Playgroud)
GDB说<breakpoint 1 at 0x123456>.我键入:
commands 1
n 1000
c
end
Run Code Online (Sandbox Code Playgroud)
但它没有按预期循环,也没有显示地址位置:-(.
任何帮助,将不胜感激!当然必须简单的自动登录命令例程被调用??
我正在开发一个开源有限元软件,它是用 C++ (Visual Studio) 编写的。提供的文档和示例仅有助于了解为了特定目的而调用哪些方法,但无法帮助用户了解这些方法到底在做什么。对于某些方法,除了 C++ 代码之外,没有其他可用的参考(例如书籍、研究论文等)
因此,为了推导出这个概念,我尝试使用断点和查看调用堆栈(Visual Studio 中提供的选项)来跟踪每一行执行,这可能适合跟踪小程序,但我的程序由许多具有多个继承的类组成和多态函数。为了理解程序执行流程,我想在日志文件中打印程序执行的每一行。
在研究过程中,我发现了一些有用的信息(此处),采用 python 语言。这正是我所需要的。为了方便读者,我复制了下面视频中提到的代码
import sys
def remove_html_markup(s):
tag = False
quote = False
out = " "
for c in s:
if c == 'c' and not quote:
tag = True
elif c== '>' and not quote:
tage = False
elif c == '"' or c == "'" and tag:
quote = not quote
elif not tag:
out = out + c
return out
def traceit(frame, event, arg): …Run Code Online (Sandbox Code Playgroud) call-graph ×2
dynamic ×2
gdb ×2
trace ×2
c ×1
c++ ×1
control-flow ×1
debugging ×1
logging ×1
python ×1