外部测试环境时程序崩溃 - C ++

时间:2011-06-10 01:47:45

标签: c++ debugging visual-c++ crash environment

我有一个程序,当从Visual Studio 2010 Express内部运行时运行非常好,但是当构建和取出时,它有问题。我设置的外部测试环境与在Visual Studio中运行时相同,因此不应该是问题。我想将它附加到.exe以查看崩溃的位置,但我没有非Express版本。

有什么建议吗?为什么程序会在VSC ++ 2010 Express环境之外崩溃,但在内部完美运行。

我会发布代码,但这是一个巨大的项目,而不是会导致错误的行。

非常感谢您的时间。

5 个答案:

答案 0 :(得分:2)

在不知道崩溃是什么的情况下确定是非常困难的,但是可能会导致这种情况的几个常见问题:

  • 环境变量不一样。也许您在测试环境中依赖于vcvars32.bat中的某些内容。
  • PATH环境变量不同,并且您拾取了一些不良或不兼容的DLL。
  • 您的代码以某种方式依赖于从Visual Studio运行的当前工作目录。

答案 1 :(得分:2)

Wikipedia to the rescue

  

时间也可能是heisenbugs的一个因素。与正常执行相比,在调试器的控制下执行程序可以改变程序的执行定时。当程序通过调试器中的单步源线减慢时,时间敏感的错误(如竞争条件)可能无法再现。当行为涉及与不在调试器控制下的实体交互时,尤其如此,例如在两台机器之间调试网络数据包处理且只有一台机器处于调试器控制之下时。

另请注意,User32.dll 稍微会在调试器下更改其行为,以便您更轻松地进行调试。但是,这不应该改变任何事情。

答案 2 :(得分:2)

您可以使用免费提供的Debugger Tools for Windows进行调试。有大量的文档和快速入门指南,尤其是安装中包含的chm。在您的情况下,您可能想尝试以下操作:

  1. 确保您的应用的PDB可以在共享的某个位置使用。
  2. 附加到应用的正在运行的实例:windbg -p <PID>。请注意,您也可以通过windbg -g foo.exe
  3. 在调试器的上下文中启动该程序
  4. 重新崩溃。
  5. 更改符号的符号路径和Microsoft公共符号服务器以获取组件的正确符号:.sympath x:\YourPathToPDBs; SRV*x:\symbols*http://msdl.microsoft.com/download/symbols
  6. 告诉调试器使用您的路径重新加载符号:.reload
  7. 通过在调试器中点击k来获取callstack。
  8. 这是你需要找出它崩溃的地方的准系统。然后,您可以更深入地尝试通过查看MSDN或Tess's blog上的调试器chm或其他资源来分析它崩溃的原因。一个有用的命令是dv来转储特定帧的局部变量。如果callstack未提供行号,请键入.lines,然后点击kkb

答案 3 :(得分:0)

您可以使用try catch块包围Main函数中的所有代码。捕获异常时,将堆栈跟踪写入日志文件。

然后运行你的exe并检查日志文件以了解程序崩溃的位置。

PS:不要忘记将* .pdb文件与exe文件放在一起,否则您将无法获取堆栈跟踪信息。

答案 4 :(得分:0)

我意识到这个问题已经有几年了,但是我遇到了同样的事情并且遇到了可能的罪魁祸首(我的案件中的实际罪魁祸首),这可能会帮助其他人解决这个问题。

在Visual Studio中运行应用程序并在外部运行它时,一个重要的区别是当前工作目录(“CWD”)。

Visual C ++解决方案/项目的典型目录结构如下:

Solution     <- the location of your solution file
  Debug      <- where the Debug executables end up
  Release    <- where the Release executables end up
  Project    <- the location of your project file
    Debug    <- where Debug intermediate files end up
    Release  <- where Release intermediate files end up

当您在Studio中执行应用程序时,无论是“开始调试”还是“启动而不调试”,默认CWD都是项目目录,因此在这种情况下Solution\Project

但是,当您只需双击应用程序执行外部时,CWD就是应用程序目录(例如Solution\Debug)。

如果您尝试从当前目录打开文件(执行std::ifstream ifstr("myfile.txt")时会发生这种情况),是否成功取决于您启动应用程序时的位置。