我是 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
,最后一个mov rax, 60
在SYS_EXIT
.
在这之后:
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
并关闭调试会话。
有谁知道为什么会发生这种情况以及如何解决?
顺便说一下,我也是 Assembly 的新手,所以如果这是由于程序中的错误而发生的,我也很感激如果有人能指出这一点。
我使用与您相同的 GDB 版本,并且始终使用 TUI 功能;但我从来没有遇到过这个问题。但是,当我使用您的代码时,会发生内部 GDB 错误。但是,如果我对您的 write syscall 函数进行了一项更改,则该错误不会出现。
尽管您不是从函数内部调用另一个函数,但我通常通过在我的 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句