我是GNU Debugger的新手。我一直在玩它,调试程序集文件(x86_64 Linux
)一天左右,就在几个小时前我发现了#39;''' 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
的{{1}}的最后一个断点。
之后:
1)我运行程序。
2)在gdb模式下,我写SYS_EXIT
来查看编写的代码。
3)我写layout asm
4)最后,我使用layout regs.
来查看寄存器如何根据编写的hello world程序进行更改。
当stepi
注册表指向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
并关闭调试会话。
有谁知道为什么会这样,以及如何解决?
顺便说一下,我也是大会中的新人,所以如果因为程序中的某些错误而发生这种情况,我也会感激,如果有人能指出这一点。
答案 0 :(得分:1)
有谁知道为什么会这样?
这种情况正在发生,因为GDB中存在一个错误(更准确地说,违反了GDB内部变量tp
不是NULL
的断言)。
如何解决?
您应该尝试使用当前版本的GDB重现此问题(错误可能已经修复),并提交错误报告(如消息告诉您的那样)。
我不知道GDB的核心文件(以及有用的内容),
它仅对GDB开发人员有用。
答案 1 :(得分:1)
我使用与您相同的GDB版本,并且我总是使用TUI功能;但我从未遇到过这个问题。但是,当我使用您的代码时,会发生内部GDB错误。但是如果我在write syscall函数中进行了一次更改,则错误不会显示出来。
虽然你没有在函数中调用另一个函数,但我通常通过至少包含&#34; push rbp&#34;,&#34; mov rbp,rsp&#34;和&来创建一个堆栈框架。 #34;离开&#34;我的x86-64函数调用中的指令。对于&#34; bug&#34;这可能是乐队助手或解决方法。
_printText:
push rbp
mov rbp, rsp
mov rax, 1
mov rdi, 1
mov rsi, text
mov rdx, len
syscall
leave
ret