在调试模式下调用函数时,GDB崩溃了。

6
我正在尝试使用MinGW在Windows上编写C++程序。已编译的程序可以正常运行,但在调试时出现问题。当我尝试检查函数或方法的执行结果(如下面的截图),GDB就会被强制终止。我已经尝试以命令行方式运行GDB,但结果是相同的。我还更改了MinGW的不同版本,但没有成功。在WSL上,通过相同的配置,GDB可以正常运行而没有任何问题。只有在本机Windows上无法工作。如果您能告诉我原因,我将不胜感激。
Just before watching "add(2, 3)".

ERROR: GDB exited unexpectedly. Debugging will now abort.


The same result of GDB command line.
"p v[1]", "p v.at(1)", "p v.empty()", "p v.size()", ... were failed,
"p add(2, 3)", "p my_obj.func()", ... were crashed.


G++ version is 8.1.0
gdb version is 8.1


尝试评估模板中内联方法的输出可能会导致这种情况,因为函数不存在。GDB只能评估_现有_函数。如果您将包装器放在这些方法周围,保证不会被内联,那么就可以做到,否则要调试容器,应该要么知道其实现,要么依赖于漂亮打印。 - Swift - Friday Pie
@Swift-FridayPie,为什么同样的代码在其他平台上调试正常呢? 我应该考虑是GDB移植到Windows的问题吗? - ias
我刚刚尝试了您的示例和相同的gdb命令,在我的Windows系统上可以正常工作。 - ssbssa
你在启动 VSC 的终端中,是否将包含 gdb 的目录作为 PATH 环境变量的第一个条目?也许你的路径中存在 exe 名称冲突。 - rioV8
你尝试过将gdb更新到最新版本吗?除了8.1版本,可能任何其他版本都可以使用,请参见https://sourceware.org/bugzilla/show_bug.cgi?id=26304#c4。 - ks1322
显示剩余2条评论
3个回答

2

1
由于不同的DLL/so放置/加载方法,msys2更加稳定。 - rioV8

2
似乎是GDB的一个错误(错误信息),并且可以通过以下步骤复现:
  • 设置64位MinGW环境
  • 使用gcc(版本8.1.0)编译和链接简单的hello world c++控制台应用程序
  • 使用gdb调试EXE文件
  • 在main函数上设置断点(b main)
  • 运行info registers命令(i r)
  • 调试器意外退出并返回到命令行。
如果网站显示正确的信息,则似乎没有人正在处理该问题,但是将GDB版本从32位更改为64位可能会解决该问题。

似乎目前没有人在处理它 - 不,它被解决为已经修复的另一个重复错误。 - ks1322
@ks1322 如果他们只是提供了解决问题的临时方法,我不会说这个 bug 已经被解决了。 - darclander
我在链接的错误报告中没有看到任何解决方法。问题得到解决是因为开发人员决定相同的问题已经在另一个错误报告中报告过了。 - ks1322

2
很可能这已经是解决了的gdb bug https://sourceware.org/bugzilla/show_bug.cgi?id=22854。 它是针对8.1版本报告的,请参见错误报告中的Version: 8.1。 它在8.2版本中得到修复,请参见错误报告中的Target Milestone: 8.2。 您应该将gdb更新至至少8.2版本。

你如何在MinGW-w64中实现这个?GDB 8.1已经与MinGW-w64构建捆绑在一起了。 - Anakhand
可能需要更新整个MinGW-w64或下载一个独立的二进制文件,我不确定,请参见https://dev59.com/tXVC5IYBdhLWcg3w1E1q。 - ks1322

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接