【问题标题】:Assigning a Functional breakpoint to windows dll/API function call将功能断点分配给 Windows dll/API 函数调用
【发布时间】:2019-05-20 10:18:00
【问题描述】:

每当调用 kernel32.dll 函数时,我都会尝试设置断点。类似于这个Get the callstack(s) when a kernel32.dll function is called

我分配了一个函数断点,但是在分配它之后有一个符号说他们永远不会被击中而且他们不会。我需要在 x86 中完成,但甚至无法让这个简单的 64 位工作。

我确实在 Tools->Options/Debugging/Symbols 中检查了“Microsoft Symbol Servers”,但缓存目录仍然是空的。我认为这是问题,但不确定。如何确保正确加载 dll 调试符号?

示例代码。

using System;
using System.Runtime.InteropServices;
namespace DebugAPI
{
  class Program
  {
    [DllImport("kernel32.dll")]
    public static extern System.UInt32 GetCurrentProcessorNumber();

    static void Main(string[] args)
    {
      var num = GetCurrentProcessorNumber();
      Console.WriteLine("Proc# " + num.ToString());
    }
  }  
}

我尝试了两种为 64 位设置函数断点的方法。 Kernel32!GetCurrentProcessorNumber {,,kernel32.dll}GetCurrentProcessorNumber

对于 x86,我尝试了以下方法 {,,kernel32.dll}_GetCurrentProcessorNumber@4 //不确定@4是否正确

【问题讨论】:

  • "不确定@4是否正确"这个数字是猜不出来的,它与调用约定和参数个数有关。 good explanation here GetCurrentProcessorNumber 是无效的,所以它是可选的或为零
  • 这就是为什么我尝试了不需要标志的64位版本,但它不是无效的,它返回一个无符号整数32。
  • 对不起,我读错了。当你说 void 我认为返回类型。所以是的,它是 0。我的问题是一个组合,没有选择“启用本机代码调试”和 VS2017 x64 错误。

标签: c# visual-studio debugging dll


【解决方案1】:

此处记录的是使用 GetCorrent ProcessorNumber 作为示例设置断点的完整步骤。注意 VS2017 似乎存在 x64 平台目标的错误。必须是 x86 或 anycpu。

  1. 在解决方案资源管理器中右键单击“YourProject”->Properties->Debug->“启用本机代码调试”=选中
  2. 在主菜单 Debug->Options->Debugging->Symbols->"Microsoft Symbol Servers" = 选中。 & 分配缓存路径
  3. 添加功能断点调试->新建断点->功能断点。

[名称选项]

[x86 & x64] - 函数名称 = Kernel32!GetCurrentProcessorNumber 语言 = 全部

[x86] 函数名称 = {,,kernel32.dll)GetCurrentProcessorNumber 语言 = 全部

[x86] 函数名称 = _NtGetCurrentProcessorNumber@0 语言 = 全部(@https://stackoverflow.com/a/40031574/1132334 之后的 # 参考 - dlatikay)

注意:第一次调试需要一段时间来下载符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2015-02-06
    相关资源
    最近更新 更多