Visual Studio C ++控制台应用程序将无法运行

时间:2015-11-20 21:57:30

标签: c++ debugging visual-studio-2013

当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.

这是一个我知道在“正常”环境中运行和运行的程序,因为数百人正在使用它并且我没有更改代码。我环境中的不同之处(因为我正在重写我们的安装过程)是:

  1. 我可能没有正确安装所有依赖项。
  2. 之前导致错误的DLL依赖项之一已被具有隔离COM引用而不是其常用COM引用的新构建版本所取代,因为它尝试访问的COM对象未注册。 (我正在尝试在新安装中实现隔离的COM。)
  3. 所以我的问题是,如果在执行第一行代码之前发生错误,我该如何追踪问题的根源?

    我无法获得合理的调用堆栈,因为即使我单步(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上放置一个断点时,断点甚至不会被击中。

1 个答案:

答案 0 :(得分:0)

事实证明,在一个依赖DLL中的某些静态初始化逻辑触发的CoCreateInstance调用期间,应用程序挂起。我想这个技巧是尝试识别依赖DLL中的静态初始化逻辑并在那里放置断点。不幸的是,似乎没有任何调试输出来帮助识别哪个DLL的静态初始化正在执行,因此无法确定哪个DLL是问题。

如果还没有问题涉及,我会询问如何在单独的问题中识别挂起的CoCreateInstance调用的来源:Application hung during CoCreateInstance when using Isolated COM

最后的答案最终出现在https://stackoverflow.com/a/34076433/78162(我必须自己制作)。

相关问题