有什么方法可以从Windows调试器扩展中获取断点列表?
我正在使用普通的C(我试图避免使用它们提供的COM接口,我甚至不确定COM接口是否提供了这样做的方法)。
我已经阅读并研究了wdbgexts.h
和dbghelp.h
,但它们似乎都没有包含任何可用的函数或全局变量,尽管这些文件中的BP有一些信息,例如{{1 }}
答案 0 :(得分:3)
使用IDebugControl :: GetNumberBreakpoints,然后使用IDebugControl :: GetBreakpointByIndex。
答案 1 :(得分:3)
Windows调试器扩展提供了功能ULONG64 GetExpression(PCSTR lpExpression)
(当然它是< sarcasm>记录良好< / sarcasm> )
#define GetExpression (ExtensionApis.lpGetExpressionRoutine)
允许您从任何WinDBG表达式获取结果,如?? @eip
。
GetExpression( "@eip"); // Without `?? ` in the beginning
接下来,如果你看看: Windows调试器帮助» Windows调试工具»调试器»调试器参考»调试器命令»语法规则»伪寄存器语法
你会发现一行如下:
$ bp Number - 相应断点的地址。例如, $ bp3(或$ bp03)是指断点ID为3的断点。 数字始终是十进制数字。如果没有断点的ID为 Number,$ bpNumber的计算结果为零。有关的更多信息 断点,请参阅使用断点。
因此,有了一些开销,你就会得到这个(工作)解决方案:
#define MAX_BREAKPOINTS 100
DWORD i, addr;
CHAR buffer[] = "$bp\0\0\0\0\0\0\0\0\0\0\0\0";
for( i = 0; i < MAX_BREAKPOINTS; ++i){
// Appends string to BP prefix
itoa( i, buffer+3, 10);
addr = GetExpression( buffer);
if( !addr){
break;
}
// Do stuff
}
另一个解决方案是使用史蒂夫约翰逊建议的COM对象。