我是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_EXIT
的mov 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 内部变量tp
NULL
的断言)。
如何修复?
您应该尝试使用当前版本的 GDB 重现此问题(该错误可能已经修复),并提交错误报告(如消息告诉您的那样)。
我不知道GDB的核心文件是什么(以及有什么用),
它仅对 GDB 开发人员有用。