【问题标题】:How to set a source files directory recursively in gdb?如何在 gdb 中递归设置源文件目录?
【发布时间】:2019-06-15 11:44:19
【问题描述】:

我正在尝试使用函数源代码在 gdb 中调试程序,但我总是需要为该函数设置 C 文件的确切路径:

frinto@kali:~/Documents/theclang/programs/helloworld$ gdb -q char_array
Reading symbols from char_array...done.
(gdb) list
1   #include <stdio.h>
2   #include <string.h>
3   
4       int main() {
5           char str_a[20];
6   
7           strcpy(str_a, "Hello, world!\n");
8           printf(str_a);
9       }
(gdb) break 6
Breakpoint 1 at 0x11c6: file char_array.c, line 6.
(gdb) break strcpy
Breakpoint 2 at 0x1040
(gdb) break 8
Breakpoint 3 at 0x11dc: file char_array.c, line 8.
(gdb) dir ~/Documents/glibc-2.28/sysdeps/i386/i686/multiarch
Source directories searched: /home/frinto/Documents/glibc-2.28/sysdeps/i386/i686/multiarch:$cdir:$cwd
(gdb) cont
The program is not being run.
(gdb) run
Starting program: /home/frinto/Documents/theclang/programs/helloworld/char_array 

Breakpoint 1, main () at char_array.c:7
7           strcpy(str_a, "Hello, world!\n");
(gdb) cont
Continuing.

Breakpoint 2, strcpy_ifunc () at ../sysdeps/i386/i686/multiarch/strcpy.c:29
29  libc_ifunc_redirected (__redirect_strcpy, strcpy, IFUNC_SELECTOR ());
(gdb) cont
Continuing.

如何告诉 gdb 在 ~/Documents/glibc-2.28 中递归查找 strcpy.c 而不必每次都设置确切的路径?

frinto@kali:~/Documents/theclang/programs/helloworld$ gdb -q char_array
Reading symbols from char_array...done.
(gdb) list
1   #include <stdio.h>
2   #include <string.h>
3   
4       int main() {
5           char str_a[20];
6   
7           strcpy(str_a, "Hello, world!\n");
8           printf(str_a);
9       }
(gdb) break 6
Breakpoint 1 at 0x11c6: file char_array.c, line 6.
(gdb) break strcpy
Breakpoint 2 at 0x1040
(gdb) break 8
Breakpoint 3 at 0x11dc: file char_array.c, line 8.
(gdb) dir /home/frinto/Documents/glibc-2.28
Source directories searched: /home/frinto/Documents/glibc-2.28:$cdir:$cwd
(gdb) run
Starting program: /home/frinto/Documents/theclang/programs/helloworld/char_array 

Breakpoint 1, main () at char_array.c:7
7           strcpy(str_a, "Hello, world!\n");
(gdb) cont
Continuing.

Breakpoint 2, strcpy_ifunc () at ../sysdeps/i386/i686/multiarch/strcpy.c:29
29  ../sysdeps/i386/i686/multiarch/strcpy.c: No such file or directory.
(gdb) cont
Continuing.

Breakpoint 3, main () at char_array.c:8
8           printf(str_a);
(gdb) 

我尝试只设置 glibc 目录,但这不起作用...

【问题讨论】:

  • 关于:(gdb) break 6 Breakpoint 1 at 0x11c6: file char_array.c, line 6. 这个断点永远不会发生,因为第 6 行是空白行
  • (gdb) info source 在 strcpy 断点处停止时,您能否编辑您的问题以包含其输出?
  • 你搞定了吗~@user10199821 ?

标签: c linux debugging gdb reverse-engineering


【解决方案1】:

以这种方式构建 GLIBC 很常见:

cd glibc-2.28 && mkdir build && cd build && ../configure --prefix=/usr && make

这会导致类似于../sysdeps/i386/i686/multiarch/strcpy.c 的源路径(它们相对于build 目录)。

所以你想要的是:

cd ~/Documents/glibc-2.28 && mkdir build; cd -
gdb -ex 'dir ~/Documents/glibc-2.28/build' -q char_array

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 2014-08-06
    • 2010-11-09
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多