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