【问题标题】:How to set breakpoints in windbg that does not stop the execution of the program just logs the function called如何在windbg中设置不停止程序执行的断点只记录调用的函数
【发布时间】: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 命令实际上带有一个计数参数,因此您不一定需要先运行.kframesbm blah "k 1;gc"
  • @EdChum 已记录在案:msdn.microsoft.com/en-us/library/ff551943.aspxFrameCount: Specifies the number of stack frames to display.

标签: windbg breakpoints


【解决方案1】:

想通了。感谢 EdChum。

命令:bm *module_name!* ".frame;gc"

【讨论】:

  • 您是如何绕过 32 个断点限制的? “您已尝试启用 XX KD 断点,这超出了 Windows 内核调试当前支持的 32 个断点的限制。超过此限制的断点将被忽略”
  • 幸运/不幸的是,我正在调试的组件没有这样的限制。而且我再也没有Windows机器来尝试了。我认为问一个新问题会更好。祝你好运!
  • 我猜那是一个用户模式应用程序,也许那里没有这样的限制。
  • 不是。它是spoolsv.exe,它以system 用户IIRC 的身份运行。
  • 可执行是用户模式。内核模式将是 .sys 驱动程序/核心操作系统 :)
猜你喜欢
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多