Debugging GDB调试器:检测到GDB的内部问题
我是GNU调试器的新手。我一直在玩它,调试汇编文件(Debugging GDB调试器:检测到GDB的内部问题,debugging,assembly,gdb,nasm,x86-64,Debugging,Assembly,Gdb,Nasm,X86 64,我是GNU调试器的新手。我一直在玩它,调试汇编文件(x86_64 Linux)大约一天了,就在几个小时前,我“发现”了TUI接口 我使用TUI接口的第一次尝试是在一次执行一个简单的Hello World程序(在asm中)的每一行时查看寄存器的变化。这是程序的代码 section .data text db "Hello, World!", 10 len equ $-text section .text global _start _start:
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
然后我创建了三个断点:一个是\u start
的右侧,另一个是\u printText
之后的右侧,最后一个是mov rax上方,60
用于系统退出
在此之后:
1) 我运行这个程序
2) 在gdb模式下,我编写布局asm
以查看编写的代码
3) 我写布局规则。
4) 最后,我使用stepi
查看寄存器如何根据编写的hello world程序进行更改
问题是,当RIP
寄存器指向ret
的地址时,对应于SYS\u 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
,它将退出):
这是一个bug,请报告它。有关说明,请参阅:
.
/build/gdb-cXfXJ3/gdb-7.11.1/gdb/thread.c:1100:内部错误:finish\u thread\st
ate:断言“tp”失败。
已检测到GDB内部的问题,
进一步调试可能不可靠。
创建GDB的核心文件?(是或否)
由于我不知道GDB的核心文件是什么(以及它的用途),所以我键入n
,调试会话将关闭
有人知道为什么会发生这种情况,以及如何修复吗
顺便说一句,我也是汇编新手,所以如果这是因为程序中出现了错误,我也希望有人能指出这一点
有人知道为什么会这样吗
这是因为GDB中有一个bug(更准确地说,GDB内部变量tp
不是NULL
的断言被违反)
如何修复
您应该尝试用当前版本的GDB重现这个错误(这个错误可能已经被修复),并提交一个错误报告(就像消息告诉您的那样)
我不知道GDB的核心文件是什么(以及什么是有用的)
它只对GDB开发人员有用。我使用与您相同的GDB版本,并且我总是使用TUI功能;但我从来没有遇到过这个问题。但是,当我使用您的代码时,会发生内部GDB错误。但是,如果我在write syscall函数中做了一个更改,则不会显示错误 尽管您不是从函数中调用另一个函数,但我通常通过在x86-64函数调用中至少包含“push-rbp”、“mov-rbp、rsp”和“leave”指令来创建堆栈帧。这可能是一个创可贴或一个关于“错误”的工作方法
可能这个报告的bug尚未修复:。@ks1322可能是另一个bug:这里的bug似乎只在TUI中显示,可能是由pogram终止后的ASM窗口触发的。我验证了它在几天前的主干GDB中仍然存在:8.0.50.20170429-git
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)
_printText:
push rbp
mov rbp, rsp
mov rax, 1
mov rdi, 1
mov rsi, text
mov rdx, len
syscall
leave
ret