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

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:

我是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
然后我创建了三个断点:一个是
\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