GDB 不提供有关附加到 gdb 的程序在何处以及如何失败的信息。世界超级联赛

GDB does not give information about where and how a program attached to gdb failed. WSL

我到处搜索如何解决这个问题,但我找不到任何东西,所以如果已经有关于这个问题的讨论帖,我很抱歉。另外,我对 Linux、GDP 和 Whosebug 还很陌生,这是我的第一个 post。

首先,我 运行 在 Debian GNU/Linux 9(扩展)上使用 Windows 子系统 Linux,当我启动 gdb 时,我得到这个:

GNU gdb (Debian 7.12-6) 7.12.0.20161007-git
...
This GDB was configured as "x86_64-linux-gnu".
...

另外,当我显示配置时,我得到了这个:

configure --host=x86_64-linux-gnu --target=x86_64-linux-gnu
          --with-auto-load-dir=$debugdir:$datadir/auto-load
          --with-auto-load-safe-path=$debugdir:$datadir/auto-load
          --with-expat
          --with-gdb-datadir=/usr/share/gdb (relocatable)
          --with-jit-reader-dir=/usr/lib/gdb (relocatable)
          --without-libunwind-ia64
          --with-lzma
          --with-python=/usr (relocatable)
          --without-guile
          --with-separate-debug-dir=/usr/lib/debug (relocatable)
          --with-system-gdbinit=/etc/gdb/gdbinit
          --with-babeltrace

我创建了一些示例 C 代码来说明我一直遇到的问题。我只是想澄清一下,我知道我正在使用堆,而且我可以很容易地在这个例子中使用字符缓冲区,问题不在于此。

我将调用这个示例程序test.c

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    char *str = malloc(8);
    char *str2 = malloc(8);

    strcpy(str, argv[1]);
    strcpy(str2, argv[2]);

    printf("This is the end.\n");
    printf("1st: %s\n2nd: %s\n", str, str2);
}

然后我用

编译了它
gcc -g -o test test.c

很快 运行,我知道一切都按预期的方式运行。

$ ./test AAAAAAAA BBBBBBBB
This is the end.
1st: AAAAAAAA
2nd: BBBBBBBB

当我在没有输入参数的情况下启动程序时,我按预期收到了分段错误。但是当我随后尝试使用 gdb 来显示到底发生了什么时,我得到以下信息。

$ gdb test
(gdb) run

Program received signal SIGSEGV, Segmentation fault.
__strcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:296
296     ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or directory.

我期望获得有关失败内容的信息,例如作为 strcpy 参数发送的目标地址和源地址,但我只得到空括号。

同样,我对 gdb 比较陌生,所以我不知道这是否正常。

任何帮助都会很棒。

编辑 1

Can you paste the output of (gdb) bt into your question? Your program is stopped in a library function that hasn't had its optional debug information installed on your system, but some other parts of the stack trace may be useful. – Mark Plotnick

(gdb) run
(gdb) bt
#0  __strcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:296
#1  0x00000000080007d5 in main (argc=1, argv=0x7ffffffde308) at test.c:10

(gdb) run AAAAAAAA
(gdb) bt
#0  __strcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:296
#1  0x00000000080007ef in main (argc=2, argv=0x7ffffffde2f8) at test.c:11

What I expected was to get information about what failed such as the destination address and the source address that were sent as parameters for strcpy, but I just get empty parentheses.

你的期望不正确:它命令GDB给你源地址和目的地址,__strcpy_sse2_unaligned需要用C(或其他高级语言)编写,并调试编译信息。但它是用手工编码的汇编语言编写的,编写者也懒得为它编写调试信息(这是相当多的额外工作,但收效甚微)。

但是,您仍然可以通过执行 up 命令(进入 main)并查看 那里.[=15 来恢复您寻找的信息=]

所以你的 backtrace 给你:

(gdb) bt
#0  __strcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:296
#1  0x00000000080007ef in main (argc=2, argv=0x7ffffffde2f8) at test.c:11

非常清楚地提到它在 test.c:11 中崩溃(即:您的 test.c[=24= 的第 11 行] 文件),回答问题的 where 部分。

并扩展@employed-russian 的回答,得到为什么:

(gdb) up
#1  0x0000555555554779 in main (argc=2, argv=0x7fffffffe158) at test.c:11
11      strcpy(str2, argv[2]);
(gdb) print(str2)
 = 0x555555756280 ""
(gdb) print argv[2]
 = 0x0