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
我到处搜索如何解决这个问题,但我找不到任何东西,所以如果已经有关于这个问题的讨论帖,我很抱歉。另外,我对 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