GDB 调试器:检测到 GDB 的内部问题



我是GNU调试器的新手。我一直在玩它,调试程序集文件(x86_64 Linux)一天左右,就在几个小时前,我"发现"了TUI界面。

我第一次尝试使用TUI界面是在一个简单的Hello World程序(在asm中)执行每一行时查看寄存器更改。这是程序的代码

section .data
text db "Hello, World!", 10
len equ $-text
section .text
global _start
_start:
nop
call _printText
mov rax, 60
mov rdi, 0
syscall
_printText:
nop
mov rax, 1
mov rdi, 1
mov rsi, text
mov rdx, len
syscall
ret

在 linux 终端中创建可执行文件后,我写

$ gdb -q ./hello -tui

然后我创建了三个断点:一个在_start的右边,另一个在_printText之后,最后一个在SYS_EXITmov rax, 60上方。

在此之后:

1)我运行程序。

2)在gdb模式下,我编写layout asm以查看编写的代码。

3)我写layout regs.

4)最后,我使用stepi来查看寄存器如何根据编写的hello world程序进行更改。

问题是,当RIP寄存器指向ret的地址时,对应于SYS_EXIT并且我点击Enter我在控制台中收到以下消息

[Inferior 1 (process 2059) exited normally]
/build/gdb-cXfXJ3/gdb-7.11.1/gdb/thread.c:1100: internal-error: finish_thread_st
ate: Assertion `tp' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n)

如果我输入n它看起来是这样的(正如它所说,如果我输入y它就会退出):

This is a bug, please report it.  For instructions, see:
<http://www.gnu.org/software/gdb/bugs/>.
/build/gdb-cXfXJ3/gdb-7.11.1/gdb/thread.c:1100: internal-error: finish_thread_st
ate: Assertion `tp' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Create a core file of GDB? (y or n) 

由于我不知道 GDB 的核心文件是什么(以及有什么用处),所以我键入n调试会话关闭。

有谁知道为什么会发生这种情况以及如何解决?

顺便说一句,我也是汇编的新手,所以如果这是由于程序中的错误而发生的,如果有人能指出这一点,我也将不胜感激。

我使用与您相同的GDB版本,并且始终使用TUI功能;但我从未遇到过此问题。但是,当我使用您的代码时,会发生内部 GDB 错误。 但是,如果我在您的写入系统调用函数中进行一项更改,则错误不会显现出来。

虽然您不会从函数内调用另一个函数,但我通常通过在 x86-64 函数调用中至少包含"push rbp"、"mov rbp"、"rsp"和"leave"指令来创建堆栈帧。 这可能是一个创可贴或关于"错误"的解决方法。

_printText:
push rbp
mov rbp, rsp
mov rax, 1
mov rdi, 1
mov rsi, text
mov rdx, len
syscall
leave
ret

有谁知道为什么会这样

发生这种情况是因为 GDB 中存在一个错误(更准确地说,违反了 GDB 内部变量tpNULL的断言)。

如何修复?

您应该尝试使用当前版本的 GDB 重现此问题(该错误可能已经修复),并提交错误报告(如消息告诉您的那样)。

我不知道GDB的核心文件是什么(以及有什么用),

它仅对 GDB 开发人员有用。

最新更新