【发布时间】: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