gdb下指定调试文件位置

前景

  • 为什么会有这个需求?

A机器编译,B机器执行,执行环境很可能不一样;
A目录编译,然后目录发生变化,比如文件挂载位置发生变化;记录的绝对路径不存在了;
编译文件的调试信息只有文件名, 没有文件路径;

目录规则

  • source path

挨个从source path记录的目录中挨个寻找;
即调试代码对应的源文件; 虽然调试信息有源文件信息; 但是因为上述原因, 需要定义搜索文件位置;
show directories 可以查看source path
默认值:$cdir:$cwd, 可以通过dir|directory添加, 首插法, 插入第一个, 可以同时多个, 使用分隔符分隔,win";" linux":";

  • 编译目录

-g选项会记录调试信息包括编译路径; 可以通过指令查看可执行程序记录的debug信息: 编译所在路径;readelf -W -wi a.out | grep DW_AT_comp_dir ; 不过滤则可以看大部分信息;

  • 调试文件路径确认

  1. 代码对应文件是绝对路径, 则以绝对路径尝试; 非绝对路径则;
  2. source path搜索路径挨个搜索;for i in source_path:file=i + source_file; , source_path可以使用show directories;
  3. compile directory + source file再进行一轮source path搜索; for i in source_path:file=i + compile_directory + source_file;
  4. 仅仅取文件名, 使用source path再进行一轮搜索; for i in source_path:file=i + filename(source_file);
  • 案例如下

# 1 + 3 * 3
cdir(compile directory):/project/build
cwd(current working directory):/home/user
source:/mnt/cross:$cdir:$cwd
file:/usr/src/foo-1.0/lib/foo.c


1. /usr/src/foo-1.0/lib/foo.c
2. /mnt/cross/usr/src/foo-1.0/lib/foo.c
3. /project/build/usr/src/foo-1.0/lib/foo.c
4. /home/user/usr/src/foo-1.0/lib/foo.c
5. /mnt/cross/project/build/usr/src/foo-1.0/lib/foo.c
6. /project/build/project/build/usr/src/foo-1.0/lib/foo.c
7. /home/user/project/build/usr/src/foo-1.0/lib/foo.c
8. /mnt/cross/foo.c
9. /project/build/foo.c
10. /home/user/foo.c

  • 目录处理特殊情况

相对路径文件: 不执行步骤1;
cdir:compile directory为空的时候, 则不会进行步骤3;
如果没有搜索到, 则输出错误;
注意: 搜索规则是进行上面的组合, 不会进行复杂的子目录搜索;比如文件名file, 就不会这样组合cdir/xxxx/xxx/file; 考虑性能
$cwd执行是根据上下文实时生成, 即工作目录变了cwd也会变;

替换规则

  • 需求

目录结构发生变化, 直接替换最快;虽然directory也可以做到;
差异: 替换适用于所有; directory可能需要添加所有目录, 因为directory的机制差异;

  • 操作

set substitute-path from to:上面的路径搜索规则生成了目录之后, 路径以from开头的路径替换为to; 不是字符替换, 是完整路径匹配才替换;
from:/test/aaa;to:/test/bbb, /test/aaad/xxx.c不会被替换, 因为没有完整路径匹配, 虽然字符匹配/test/aaa;

指令介绍

  • directory dirname... | dir dirname ...

首插法; 拼接符号win ";" linux ":"或空格添加; 重复添加则向前;比如$cdir,$cwd, 虽然已存在, 但是可以提前;

  • directory

重制为$cdir:$cwd, 需要确认; 自动化脚本需要注意;

  • set directories path-list

直接替换赋值; 而不是插入; 如果没有$cdir:$cwd, 会放在末尾;

  • show directories

查看搜索目录值

  • set substitute-path from to

尾插法; 如果from存在类似更新, 但是会删除原from再尾插新的from to;
匹配: 第一个发现则停止;
须知: 可能因为先后顺序, from存在子目录, 则可能导致错误修改带来的bug;

  • unset substitute-path [path]

path删除对应, 没有警告; 没有path删除所有;

  • show substitute-path [path]

pathfrom, path查看对应的规则, 没有警告; 无path查看所有;

你可能感兴趣的:(gdb,linux,运维,服务器)