在Delphi中调试OutputDebugString调用

在Delphi中调试OutputDebugString调用,delphi,debugging,delphi-2009,breakpoints,outputdebugstring,Delphi,Debugging,Delphi 2009,Breakpoints,Outputdebugstring,我的应用程序中有一些“rogue”OutputDebugString调用,它会打印出“T”,但我无法找到它 是否可以在OutputDebugString函数上设置断点并查看从何处调用它 我使用的是Delphi 2009。您的项目中有多少个对OutputDebugString的调用?您可以使用“在文件中查找”对话框来查找所有文件,如果文件不太多,就不会有问题 否则,您当然可以使用搜索和替换,并将所有OutputDebugString(替换为raiseexception.Create() 您还可以编

我的应用程序中有一些“rogue”OutputDebugString调用,它会打印出“T”,但我无法找到它

是否可以在OutputDebugString函数上设置断点并查看从何处调用它


我使用的是Delphi 2009。

您的项目中有多少个对
OutputDebugString
的调用?您可以使用“在文件中查找”对话框来查找所有文件,如果文件不太多,就不会有问题

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

您还可以编写一个函数

procedure OutputDebugString(const Str: string);
begin
  raise Exception.Create(Str);
end;
在项目中每个其他单位使用的单位中。如果在
使用列表中的
Windows.pas
之后仅声明此新单位,则将使用此新功能而不是Windows.pas功能

更新 可以,您可以在Windows.pas中放置断点。首先,在项目中,转到“项目选项”,然后在“调试”下,选择“使用调试DCU”。然后,您可以转到Windows.pas并在第30769行放置断点:

procedure OutputDebugString; external kernel32 name 'OutputDebugStringW';
  • 运行应用程序
  • 暂停
  • 打开查看/调试窗口/模块 窗户
  • 搜索kernel32.dll。双击它
  • 搜索OutputDebugStringA.Double 点击它
  • CPU窗口打开。将断点设置为 第一行
  • 搜索OutputDebugStringW.Double 点击它
  • CPU窗口打开。将断点设置为 第一行
完成了


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

项目和组件中分布了太多。我甚至不确定消息是否来自自己的代码或第三方代码。如果不是您的代码,而是您(间接)使用的某个单元调用也可以转到OutputDebugStringA。