程序在测试环境外崩溃-C++
Program crashes when outside test environment - C++
我有一个程序在Visual Studio 2010学习版内部运行时运行得非常出色,但在构建和取出时,它会出现问题。我已经设置了与从Visual Studio中运行时相同的外部测试环境,所以这应该不是问题。我想把它附加到.exe上,看看崩溃在哪里,但我没有非Express版本。
有什么建议吗?为什么一个程序会在VSC++2010Express环境之外崩溃,而在内部却运行得很好。
我会发布代码,但这是一个巨大的项目,而不是一行会导致错误。
非常感谢您抽出时间。
如果不知道崩溃是什么,很难确定,但有几个常见问题可能会导致这种情况:
- 环境变量不相同。也许您在测试环境中依赖于vcvars32.bat中的某些内容
- PATH环境变量不相同,您正在获取一些坏的或不兼容的DLL
- 您的代码在某种程度上取决于当前工作目录,即从Visual Studio运行时的工作目录
维基百科来拯救?
时间也可能是黑森堡的一个因素。与正常执行相比,在调试器的控制下执行程序可以改变程序的执行定时。当程序被调试器中的单步源代码行放慢速度时,诸如竞争条件之类的时间敏感错误可能不会重现。当行为涉及与不受调试器控制的实体的交互时,尤其如此,例如当调试两台机器之间的网络数据包处理,而只有一台机器受调试器控制时。
此外,请注意,User32.dll
在调试器下会稍微更改其行为,以使调试更容易。不过,这不应该改变任何事情。
您可以使用免费提供的Windows调试器工具对此进行调试。有大量的文档和快速入门指南,尤其是安装中包含的chm。在您的情况下,您可能想尝试以下操作:
- 确保您的应用程序的PDB在共享的某个位置可用
- 附加到应用程序的运行实例:
windbg -p <PID>
。请注意,您也可以通过执行windbg -g foo.exe
在调试器的上下文下启动程序 - 重现坠机事件
- 更改符号的符号路径和Microsoft公共符号服务器,以获取组件的正确符号:
.sympath x:YourPathToPDBs; SRV*x:symbols*http://msdl.microsoft.com/download/symbols
- 告诉调试器使用您的路径重新加载符号:
.reload
- 通过在调试器中点击
k
来获取调用堆栈
这是你需要弄清楚它在哪里坠毁的基本情况。然后,您可以通过查看MSDN或Tess的博客上的调试器chm或其他资源来深入分析它崩溃的确切原因。一个有用的命令是dv
,用于转储特定帧的局部变量。如果调用堆栈没有给出行号,请键入.lines
,然后点击k
或kb
。
您可以用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")
时会发生这种情况),则是否成功取决于启动应用程序时的位置。
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃
- 将方法转换为调用该方法的成员函子对象会导致崩溃