【问题标题】:Can't step into a DLL call无法进入 DLL 调用
【发布时间】:2014-04-09 00:50:43
【问题描述】:

我有一个非托管应用程序“A”,它在运行时表现出奇怪的行为。 “A”是一个调用 DLL 项目“B”的 MSVC++ 项目(不支持 CLR)。 “B”是另一个支持 CLR 的 MSVC++ 项目:

void LoggerPost(DWORD dwSeverity, LPTSTR szAppID, LPTSTR szMsgString)
{
    UnmanagedLoggerClient::LogMessage(dwSeverity, szAppID, "", szMsgString);
}

上述方法,从“A”调用,调用“B”中的LogMessage函数。此调用起初有效,但随着时间的推移,该方法在此 DLL 上被更频繁地调用,最终,对该方法的调用停止返回。结果,我试图找出 LogMessage 方法中是否存在死锁。我尝试通过将调试器附加到项目“A”来调试它。令我惊讶的是,我发现进入 LogMessage 函数不起作用!我似乎无法进入它。我在同一个目录中拥有两个项目的 PDB,并且我确保“仅我的代码”的调试选项已关闭,但无济于事。现在我想弄清楚如何在运行时中断这个方法调用......有什么想法吗?

【问题讨论】:

  • 您是否启用了混合模式调试?如果您要使用 Native -> CLR,您可能必须强制 VS 进入该模式,我之前遇到过这个问题。
  • 您的 MSVC 是 2013 版吗?在我的情况下,CLR 程序可以从 MSVC 2012 的本机程序中单步执行,但不能从 MSVC2013 中单步执行。而且在我的记忆中(不确定),如果MSVC2013 CLR程序是/clr,是不能单步进入的,而/clr:pure可以。
  • @TimoGeusch 通过在编译前在项目的属性页面中将 Mixed 设置为调试选项?
  • @cbel 平台工具集是2013,我用的是VS2013,你指的是这个吗?我会试试 /clr:pure。
  • @Alexandru,是的,但是你只需要在调试之前设置它,编译不需要它。

标签: c++ .net visual-c++ dll clr


【解决方案1】:

附加调试器时(调试 -> 附加到进程),其中显示“附加到:”我必须点击“选择...”按钮 -> 勾选“调试这些代码类型:” -> 选择托管(v4.5、v4.0)、本机和托管兼容模式,然后附加到进程以便能够通过其调用进行调试。

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    相关资源
    最近更新 更多