我正在调试一个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
命令中使用可以打印函数名称的变量名称(如果不是函数名称,还可以使用断点号)?
答案 0 :(得分:6)
想出来。感谢EdChum。
命令:bm *module_name!* ".frame;gc"