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

时间:2017-05-11 07:09:27

标签: debugging assembly gdb nasm x86-64

我是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并关闭调试会话。

有谁知道为什么会这样,以及如何解决?

顺便说一下,我也是大会中的新人,所以如果因为程序中的某些错误而发生这种情况,我也会感激,如果有人能指出这一点。

2 个答案:

答案 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