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

Program crashes when outside test environment - C++

本文关键字:崩溃 -C++ 测试环境 程序      更新时间:2023-10-16

我有一个程序在Visual Studio 2010学习版内部运行时运行得非常出色,但在构建和取出时,它会出现问题。我已经设置了与从Visual Studio中运行时相同的外部测试环境,所以这应该不是问题。我想把它附加到.exe上,看看崩溃在哪里,但我没有非Express版本。

有什么建议吗?为什么一个程序会在VSC++2010Express环境之外崩溃,而在内部却运行得很好。

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

非常感谢您抽出时间。

如果不知道崩溃是什么,很难确定,但有几个常见问题可能会导致这种情况:

  • 环境变量不相同。也许您在测试环境中依赖于vcvars32.bat中的某些内容
  • PATH环境变量不相同,您正在获取一些坏的或不兼容的DLL
  • 您的代码在某种程度上取决于当前工作目录,即从Visual Studio运行时的工作目录

维基百科来拯救?

时间也可能是黑森堡的一个因素。与正常执行相比,在调试器的控制下执行程序可以改变程序的执行定时。当程序被调试器中的单步源代码行放慢速度时,诸如竞争条件之类的时间敏感错误可能不会重现。当行为涉及与不受调试器控制的实体的交互时,尤其如此,例如当调试两台机器之间的网络数据包处理,而只有一台机器受调试器控制时。

此外,请注意,User32.dll在调试器下会稍微更改其行为,以使调试更容易。不过,这不应该改变任何事情。

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

  1. 确保您的应用程序的PDB在共享的某个位置可用
  2. 附加到应用程序的运行实例:windbg -p <PID>。请注意,您也可以通过执行windbg -g foo.exe在调试器的上下文下启动程序
  3. 重现坠机事件
  4. 更改符号的符号路径和Microsoft公共符号服务器,以获取组件的正确符号:.sympath x:YourPathToPDBs; SRV*x:symbols*http://msdl.microsoft.com/download/symbols
  5. 告诉调试器使用您的路径重新加载符号:.reload
  6. 通过在调试器中点击k来获取调用堆栈

这是你需要弄清楚它在哪里坠毁的基本情况。然后,您可以通过查看MSDN或Tess的博客上的调试器chm或其他资源来深入分析它崩溃的确切原因。一个有用的命令是dv,用于转储特定帧的局部变量。如果调用堆栈没有给出行号,请键入.lines,然后点击kkb

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

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

附言:别忘了把*.pdb文件和exe文件放在一起,否则你将无法获得堆栈竞争信息。

我意识到这个问题已经存在几年了,但我一直在经历同样的事情,并发现了一个可能的罪魁祸首(在我的案例中是真正的罪魁祸首),这可能会帮助其他有这个问题的人。

在VisualStudio中运行应用程序和在外部运行应用程序时,一个重要的区别是当前工作目录("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是Project目录,因此在本例中为SolutionProject

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

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