当C ++控制台应用程序构建和启动但不运行任何代码时,可以做什么,至少不是调试器可以看到的任何代码?我有一个主要功能的程序:
int main (int argc, char *argv[])
{
short retval = 0;
retval = samain ( (short) argc, argv);
return ((int) retval);
}
我在第一行(retval=0
)上放了一个断点,为了安全起见后面的一行,然后运行。它显示一个控制台窗口并挂起,直到我停止调试器。调试输出显示正在加载的多个DLL,但没有其他任何内容。它以这条看起来非常类似于之前的几十行结束:
'fcmtsysmd.exe' (Win32): Loaded 'C:\Windows\SysWOW64\RpcRtRemote.dll'. Cannot find or open the PDB file.
这是一个我知道在“正常”环境中运行和运行的程序,因为数百人正在使用它并且我没有更改代码。我环境中的不同之处(因为我正在重写我们的安装过程)是:
所以我的问题是,如果在执行第一行代码之前发生错误,我该如何追踪问题的根源?
我无法获得合理的调用堆栈,因为即使我单步(F10键)启动程序,它也会立即挂起。如果我在那一点断开,我会看到以下调用堆栈:
ntdll.dll!7743fdd1() Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7743fdd1() Unknown
ntdll.dll!77475f86() Unknown
ntdll.dll!77459809() Unknown
当我从依赖DLL中删除隔离的COM设置时,我可以获得访问冲突异常并停止调试器中的某些代码。它在另一个DLL中的静态变量初始化期间被调用的函数停止。奇怪的是,当我将隔离的COM设置添加到第一个DLL,并在另一个DLL上放置一个断点时,断点甚至不会被击中。
答案 0 :(得分:0)
事实证明,在一个依赖DLL中的某些静态初始化逻辑触发的CoCreateInstance调用期间,应用程序挂起。我想这个技巧是尝试识别依赖DLL中的静态初始化逻辑并在那里放置断点。不幸的是,似乎没有任何调试输出来帮助识别哪个DLL的静态初始化正在执行,因此无法确定哪个DLL是问题。
如果还没有问题涉及,我会询问如何在单独的问题中识别挂起的CoCreateInstance调用的来源:Application hung during CoCreateInstance when using Isolated COM
最后的答案最终出现在https://stackoverflow.com/a/34076433/78162(我必须自己制作)。