如何在main()之前调试程序崩溃



我在windows 8.1上使用QtCreator和visual studio 2015工具包来构建我在Linux上开发和测试的程序,在Linux上它可以正常工作,但在windows上它会立即崩溃,我不知道该找什么。

除了QT之外,我唯一使用的外部库是opengl和glew,所以我不认为是它们。

有什么在GNU C++中工作但在MSVC中立即崩溃的东西吗?

通常这种崩溃与您的程序完全无关。这是一个外部图书馆链接问题。我最近在OpenSplice DDS库中遇到了这个问题。我链接到一个库,该库在任何事情开始之前就导致了分段错误。我通过链接预先编译的库1-by-1来解决这个问题,并检查每个库是否修复了程序。

我建议您做的是:逐步删除您链接到的库和资源,直到您的程序启动并从main()的第一行打印出"Hello world"。

另一种方法是制作一个新的空程序,并链接您在程序中使用的相同资源。这比较容易,因为它不需要修改程序。

这就是我要做的。

首先从干净状态重新构建整个解决方案或项目。以防万一,这只是一些奇怪的依赖性问题,导致某些东西无法重新编译。永远不会受伤。

正如Neil在对该问题的评论中所说,崩溃可能来自一个全局变量,该全局变量的构造函数在main或WinMain之前运行。你确定你没有声明为"静态"或在全局范围内可能有构造函数的东西吗?

现在执行以下操作:

  • 打开Visual Studio。

  • 从菜单中,选择"文件"->"打开"->"项目/解决方案…"。。。

  • 当弹出文件打开对话框时,选择Qt生成的EXE创造者。(没错,您正在将EXE作为一个项目打开)。此目录通常是Qt项目(..\build-yourapp-Desktop_Qt_5_7_MSVC2015_32bit-Debug\Debug)之上的一个文件夹级别

  • 现在按下绿色箭头开始调试(菜单->调试->启动调试)。如果一切顺利,你的程序将提前失败,

由于Qt Creator没有将所有Qt*.dll二进制文件复制到您的构建目录中,因此该程序很可能根本无法在Visual Studio下运行。你会弹出一堆对话框,上面写着"由于找不到Qt5-XYZ.dll,程序无法启动"。通过以下任何方式更新PATH环境以将Qt5.x.05.xmsvc2015bin文件夹包含在PATH中,可以很容易地解决此问题。

  • 您可以从命令链接添加它,然后从命令行重新启动devenv.exe。

  • 您可以从"控制面板"->"系统"->"高级"全局添加它。然后从Windows桌面重新启动Visual Studio。

  • 从Visual Studio中打开EXE调试项目后,只需右键单击项目名称(而不是父解决方案),就会弹出一个对话框,允许您编辑启动设置。其中之一就是环境。

这样就可以了。从那里你可以在EXE上启动调试器,根据需要设置断点,并在崩溃时分析调用堆栈。

这真的很容易:使用调试信息构建所有您使用的库,包括Qt(只要生成了PDB文件,这些库就可以是发布版本)。然后在调试器下运行应用程序(例如QtCreator下的F5),它将在崩溃时停止。

main之前运行并且已知会引起问题的代码将是全局对象初始化:您可能会遇到静态初始化顺序的惨败。

问题的另一个原因可能是堆栈溢出。在Linux中,默认情况下堆栈大小通常为8MB,而在Windows中只有1MB。

尝试使用/STACK:8388608开关进行链接。如果它有效,您可能会考虑在堆上分配更多的数据,并保持默认的1MB堆栈大小。

最新更新