【问题标题】:error LNK2019: unresolved external symbol __CheckForDebuggerJustMyCode referenced in function DriverEntry错误 LNK2019:未解析的外部符号 __CheckForDebuggerJustMyCode 在函数 DriverEntry 中引用
【发布时间】:2019-01-22 00:37:27
【问题描述】:

我编写了一个 Windows 10 驱动程序。

以下是代码,实际上代码是 docs.microsoft.com 的示例。

有没有人知道我该怎么处理这个问题。

#include <ntddk.h>
#include <wdf.h>


DRIVER_INITIALIZE DriverEntry;
EVT_WDF_DRIVER_DEVICE_ADD KmdfHelloWorldEvtDeviceAdd;


NTSTATUS
DriverEntry(
    _In_ PDRIVER_OBJECT     DriverObject,
    _In_ PUNICODE_STRING    RegistryPath
)
{
    // NTSTATUS variable to record success or failure
    NTSTATUS status = STATUS_SUCCESS;

    // Allocate the driver configuration object
    WDF_DRIVER_CONFIG config;

    // Print "Hello World" for DriverEntry
    KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: DriverEntry\n"));

    // Initialize the driver configuration object to register the
    // entry point for the EvtDeviceAdd callback, KmdfHelloWorldEvtDeviceAdd
    WDF_DRIVER_CONFIG_INIT(&config,
        KmdfHelloWorldEvtDeviceAdd
    );

    // Finally, create the driver object
    status = WdfDriverCreate(DriverObject,
        RegistryPath,
        WDF_NO_OBJECT_ATTRIBUTES,
        &config,
        WDF_NO_HANDLE
    );
    return status;
}


NTSTATUS
KmdfHelloWorldEvtDeviceAdd(
    _In_    WDFDRIVER       Driver,
    _Inout_ PWDFDEVICE_INIT DeviceInit
)
{
    // We're not using the driver object,
    // so we need to mark it as unreferenced
    UNREFERENCED_PARAMETER(Driver);

    NTSTATUS status;

    // Allocate the device object
    WDFDEVICE hDevice;

    // Print "Hello World"
    KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: KmdfHelloWorldEvtDeviceAdd\n"));

    // Create the device object
    status = WdfDeviceCreate(&DeviceInit,
        WDF_NO_OBJECT_ATTRIBUTES,
        &hDevice
    );
    return status;
}

帮助!如果您有什么建议,请告诉我。

错误信息是:

Driver.obj : error LNK2019: unresolved external symbol __CheckForDebuggerJustMyCode referenced in function DriverEntry

【问题讨论】:

    标签: windows driver


    【解决方案1】:

    这与 Visual Studio 2017 15.8 中的新 C++ Just My Code Stepping 功能有关。

    如果出现错误,请打开项目属性对话框并将“配置属性 -> C/C++ -> 常规 -> 仅支持我的代码调试”选项设置为否。

    【讨论】:

    • 请尝试更好地解释您的答案,以便更容易理解
    • 在哪里可以找到这个选项?您指的是“选项”对话框吗?如果是这样,我找不到这个选项。使用“选项”对话框中的“搜索”功能,我在 [Environment\General] 中看到“仅启用我的代码”,但没有看到“c/c++ -> 常规 -> 支持仅我的代码调试”。事实上,我根本没有在选项对话框的顶层看到 C++。
    • 我找到了。您指的是“项目属性”对话框。
    【解决方案2】:

    这与 Visual Studio 2017 15.8 中的新 C++Just My Code Stepping (JMC) 功能有关。由于该功能依赖于 CRT(C Run-Time Libraries),如果项目没有链接到 CRT,它可能会命中error LNK2019: unresolved external symbol __CheckForDebuggerJustMyCode

    解决方法是通过以下方法之一禁用 JMC:

    1. 在项目设置中,“配置属性”->“C/C++”->“常规”:“仅支持我的代码调试”。改为 NO。
    2. 在项目设置中,将/JMC-添加到“配置属性”->“C/C++”->“命令行”->“附加选项”

    【讨论】:

    • Visual Studio 社区 2017 版 15.6.4 没有此选项 - 关于如何处理该问题的任何建议?
    • 理论上15.6.4是没有这个功能的。因此,您根本不应该遇到此链接故障。如果不是这样,请在开发者社区@developercommunity.visualstudio.com/spaces/62/index.html 上提交工单
    • 15.6.4 没有此功能,但是如果使用的库已更新并且现在它已在 15.8 版本上构建,该怎么办 - 当然更新到 15.8 会解决问题,但是什么如果那不可能?有可能抑制这个吗?
    • 问题是:编译器后端插入了一个调用函数到CRT中存在的__CheckForDebuggerJustMyCode。旧工具集(较旧的 15.8,例如 15.6)无法插入此调用。要抑制它,请在构建期间将 /JMC- 添加到编译器开关。
    • 将 /JMC 添加到旧版本只会创建一条消息,说明开关未知 - 在建议之前尝试一下
    【解决方案3】:

    在 Visual Studio 15.8 中,他们引入了JustMyCode 调试,它实际上在调试配置中破坏了内核驱动程序的编译。

    It looks like a bug,但解决方法是暂时在发布模式下编译。

    【讨论】:

    • 实际上解决方法是禁用 JustMyCode 功能。 Unfortunately you have to do it for each and every project.
    • 我个人不得不在我为 NSIS 编写的插件上禁用 JustMyCode,因为这个问题是以同样的方式触发的 - 我删除了 MSVCRT,以便插件会很小(打包之前的二进制文件) NSIS 安装程序为 7680 字节),独立于 Windows 版本,并且不依赖于已安装运行时。附言感谢您的建议,它帮助我的 VS2017 构建再次工作。
    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    相关资源
    最近更新 更多