繁体   English   中英

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

[英]Visual Studio C++ Console Application Won't Run

当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。)

所以我的问题是,如果在执行第一行代码之前发生错误,我该如何追踪问题的根源?

我无法获得明智的调用堆栈,因为即使我单步执行(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上放置一个断点时,该断点甚至都没有命中。

事实证明,在依赖于其中一个DLL的某些静态初始化逻辑触发的对CoCreateInstance的调用期间,该应用程序已挂起。 我猜想诀窍是试图在依赖的DLL中识别静态初始化逻辑,并在其中放置断点。 不幸的是,似乎没有任何调试输出可帮助识别哪个DLL的静态初始化在何时执行,因此无法确定哪个DLL是问题所在。

我将在一个单独的问题中询问有关如何识别挂起的CoCreateInstance调用的源的问题,如果还没有覆盖它的问题: 使用隔离COM时在CoCreateInstance期间应用程序挂起

最终的答案是在https://stackoverflow.com/a/34076433/78162 (我必须自己创建)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM