c - 如何在 gdb 中递归设置源文件目录?
问题描述
我正在尝试使用函数源代码在 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 递归查找strcpy.c
而~/Documents/glibc-2.28
不必每次都设置确切的路径?
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 目录,但这不起作用......
解决方案
以这种方式构建 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
推荐阅读
- amazon-web-services - 浏览器无法连接到 AWS 托管
- php - Codeigniter:查询结果不重复字段
- javascript - Highstocks 图表:显示一周数据
- vue.js - 使用 mapbox 进行坐标转换
- python - 未收到密码重置电子邮件
- spring - 如何在 Spring 5 和 Tomcat 8 (Log4jConfigListener) 中加载外部 log4j 日志配置
- php - 基于条带数量的计费 - 发票已支付
- ruby-on-rails - Docker:chmod:无法访问“chmod”:没有这样的文件或目录
- java - 如何返回实现列表?
- three.js - THREE.js 从加载的 GLTF 中定位缓冲区几何的各个实例