在Delphi中调试OutputDebugString调用

5

我的应用程序中有一些“流氓”OutputDebugString调用,它们打印出“T”,但我无法定位到它们。

是否有可能在OutputDebugString函数上设置断点,并查看它是从哪里调用的?

我正在使用Delphi 2009。

2个回答

13

你的项目中调用了多少次OutputDebugString?您可以使用“在文件中查找”对话框查找它们,如果它们不太多,那么应该没有问题。

否则,您当然可以使用搜索和替换并将所有OutputDebugString(替换为raise Exception.Create(

您还可以编写一个函数。

procedure OutputDebugString(const Str: string);
begin
  raise Exception.Create(Str);
end;

在项目中,每个其他单位使用的单位中使用的一个单位。如果只有在uses列表中声明了这个新单位,并且它是在Windows.pas之后声明的,那么这个新函数将代替Windows.pas中的函数。

更新

是的,你可以在Windows.pas中放置断点。首先,在你的项目中,进入项目选项,在调试下面,选择“使用调试DCUs”。然后你就可以去Windows.pas中,在第30769行设置断点:

procedure OutputDebugString; external kernel32 name 'OutputDebugStringW';

1
在整个项目和组件中分散太多了... 我甚至不确定该消息是来自自己的代码还是第三方代码。 - Harriv
2
如果这不是你的代码,而是你间接使用的某个单元,则调用也可能会转到OutputDebugStringA。 - Remko

7
  • 运行您的应用程序。
  • 将其暂停。
  • 打开视图/调试窗口/模块窗口。
  • 搜索 kernel32.dll。双击它。
  • 搜索 OutputDebugStringA。双击它。
  • CPU 窗口打开。在第一行设置断点。
  • 搜索 OutputDebugStringW。双击它。
  • CPU 窗口打开。在第一行设置断点。

完成。

现在,您的应用程序中的任何对 OutputDebugString 的调用都会在断点处中断。您还可以在断点属性中打开日志记录以记录调用堆栈。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接