我试图在我的Ubuntu VM (22.04.1 LTS)上使用gdb (Ubuntu 12.1),但每当我尝试run
命令时,它总是给出分段错误,无论程序正在调试.
(gdb) run
Starting program: /home/dir/a.out
Program received signal SIGSEGV, Segmentation fault.
0x0000aaaa9aa5ac89 in ?? ()
即使使用-g
GCC选项也会发生这种情况。
有趣的是,在我的笔记本电脑上,安装了相同的Ubuntu VM和相同的gcc/gdb版本,gdb工作得很好。所以我真的不明白是什么引起了这个问题。
我卸载并重新安装了gcc和gdb,甚至成功地运行了sudo apt update
和随后的sudo apt upgrade
,但是分割错误仍然存在。
编辑:在互联网上没有发现类似的问题,但我认为问题的原因可能是运行Ubuntu的VirtualBox(7.0.4),显然MacOS Ventura还没有完全支持它。
您可以尝试降级到VirtualBox 6.1。我在MacOS Monterey上使用VirtualBox 7.0.6时遇到了类似的问题,但在我降级到VirtualBox 6.1.42后问题就解决了。
如果这不起作用,那么问题可能是Ventura。
<0x0000aaaa9aa5ac89"是一个可疑的地址,这可能导致这个SEGV的根本原因。在加载dl_main (glibc, pre main())中的程序共享库时,我在gdb中遇到了类似的SEGV,我在这里记录了它,以防它对某人有所帮助。
在我的例子中,dl_main导致了SEGV。安装过程是gdb调试在gdbserver下运行的远程程序。主机gdb由vscode控制,设置为"stopAtConnect: true"。
我能够通过在gdb主机和运行gdbserver的调试目标上安装相同版本的glibc来解决我的SEGV。
我认为发生的事情是stopAtConnect设置在目标进程中插入了一个断点,但是使用了主机调试符号信息,该信息来自不同版本的glibc。我认为插入的断点字节改变了目标进程中的某些机器指令,使得它正在做一些无效的事情。