【发布时间】:2014-10-07 10:58:33
【问题描述】:
我正在调试一个 Windows 组件,并希望查看被调用的特定 dll 的所有函数(也按照它们被调用的确切顺序)。我可以通过将组件附加到 windbg 并在相关 dll 的所有导出函数 (bm *module_name!*) 上设置断点来做到这一点。
这按预期工作。每当调用该 dll 的导出函数时,windbg 都会中断执行并在屏幕上打印有关被命中断点的信息。之后,我可以通过按 F5 或发出 go 命令手动恢复执行。
问题: dll 的某些功能必须非常快速(立即)返回,否则组件崩溃。在这种情况下,断点会导致组件崩溃。我可以删除有问题的断点,但不会有日志记录它被击中。
我环顾四周,发现只要遇到断点,我就可以运行命令。 bm module_name!func_name ".printf \"func_name\n\";gc" 但这对于每个导出的函数都是不可行的。 dll 有大约 100 个导出函数。
我可以做些什么来记录(在屏幕上)每个被命中的导出函数(如果没有别的办法,即使是断点号也可以)。我可以在printf 命令中使用可以打印函数名称(如果不是函数名称,则为断点编号)的变量名称?
【问题讨论】:
-
这里有什么问题,你想要一个被命中的函数列表,然后继续但删除断点,或者你只想输出调用堆栈的第一行?你可以试试
.kframes=1;bm *modulename!* "kb;gc",这会将调用堆栈设置为 1,对于每个断点命中,它只会转储第一个调用,这将是函数命中,但你会得到很多命中 -
对不起,你只是想为每个断点命中转储调用堆栈,命令字符串
"kb;gc"会这样做,如果这太冗长而你只想要函数名,那么.kframes=0n1会将调用堆栈深度设置为 1,抱歉我的原始评论中有错字 -
好的,我知道我哪里出错了
.kframes 1将调用堆栈设置为深度 1,这将减少显示调用堆栈的详细程度 -
k命令实际上带有一个计数参数,因此您不一定需要先运行.kframes:bm blah "k 1;gc" -
@EdChum 已记录在案:msdn.microsoft.com/en-us/library/ff551943.aspx。
FrameCount: Specifies the number of stack frames to display.
标签: windbg breakpoints