GDB 不会提供有关附加到 gdb 的程序在何处以及如何失败的信息.唰��



我已经到处搜索了如何解决此问题,但找不到任何东西,所以如果这个问题已经存在一个线程,我很抱歉。另外,我对Linux,GDP和StackOverflow相当陌生,这是我的第一篇文章。

首先,我在 Debian GNU/Linux 9(拉伸)上运行 Linux 的 Windows 子系统,当我启动 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 代码来显示我遇到的问题。我只是想澄清一下,我知道我正在使用堆,并且我可以轻松地在本例中使用 char 缓冲区,问题不在于此。

我将此示例程序称为 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: %sn2nd: %sn", 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

您可以将(gdb) bt的输出粘贴到您的问题中吗?您的程序在尚未在系统上安装其可选调试信息的库函数中停止,但堆栈跟踪的其他一些部分可能很有用。– 马克·普洛特尼克

(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

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

您的期望是不正确的:它命令 GDB 为您提供源地址和目标地址,__strcpy_sse2_unaligned需要用C(或其他高级语言)编写,并使用调试信息进行编译。但是它是用手工编码的汇编编写的,作者也不关心为它编写调试信息(这是相当多的额外工作,几乎没有什么好处)。

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

所以你的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文件的第11行),回答了您问题的where部分。

并扩展@employed俄语的答案,以了解原因

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

最新更新