【问题标题】:Debugging OutputDebugString calls in Delphi在 Delphi 中调试 OutputDebugString 调用
【发布时间】:2010-11-23 17:18:26
【问题描述】:

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

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

我使用的是 Delphi 2009。

【问题讨论】:

    标签: delphi debugging delphi-2009 breakpoints outputdebugstring


    【解决方案1】:

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

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

    你也可以写一个函数

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

    在项目中所有其他单元使用的单元中。如果在uses 列表中的Windows.pas 之后仅声明了这个新单元,则将使用这个新函数而不是 Windows.pas 函数。

    更新

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

    procedure OutputDebugString; external kernel32 name 'OutputDebugStringW';
    

    【讨论】:

    • 太多跨项目和组件的分布。我什至不确定消息是来自自己的代码还是第三方代码。
    • 如果不是您的代码而是您(间接)使用的某个单元,该调用也可以转到 OutputDebugStringA。
    【解决方案2】:
    • 运行您的应用程序。
    • 暂停。
    • 打开视图/调试窗口/模块 窗口。
    • 搜索 kernel32.dll。双击它。
    • 搜索 OutputDebugStringA。双倍的 点击它。
    • CPU 窗口打开。在 第一行。
    • 搜索 OutputDebugStringW。双倍的 点击它。
    • CPU 窗口打开。在 第一行。

    完成。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多