在Delphi中调试OutputDebugString调用
我的应用程序中有一些“rogue”OutputDebugString调用,它会打印出“T”,但我无法找到它 是否可以在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() 您还可以编
我使用的是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。