前景
A机器编译,B机器执行,执行环境很可能不一样;
A目录编译,然后目录发生变化,比如文件挂载位置发生变化;记录的绝对路径不存在了;
编译文件的调试信息只有文件名, 没有文件路径;
目录规则
挨个从
source path
记录的目录中挨个寻找;
即调试代码对应的源文件; 虽然调试信息有源文件信息; 但是因为上述原因, 需要定义搜索文件位置;
show directories
可以查看source path
默认值:$cdir:$cwd
, 可以通过dir|directory
添加, 首插法, 插入第一个, 可以同时多个, 使用分隔符分隔,win";" linux":"
;
-g
选项会记录调试信息包括编译路径; 可以通过指令查看可执行程序记录的debug
信息: 编译所在路径;readelf -W -wi a.out | grep DW_AT_comp_dir ; 不过滤则可以看大部分信息;
- 代码对应文件是绝对路径, 则以绝对路径尝试; 非绝对路径则;
source path
搜索路径挨个搜索;for i in source_path:file=i + source_file;
,source_path
可以使用show directories
;compile directory + source file
再进行一轮source path
搜索;for i in source_path:file=i + compile_directory + source_file;
- 仅仅取文件名, 使用
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
;
指令介绍
首插法; 拼接符号
win ";" linux ":"
或空格添加; 重复添加则向前;比如$cdir,$cwd
, 虽然已存在, 但是可以提前;重制为
$cdir:$cwd
, 需要确认; 自动化脚本需要注意;直接替换赋值; 而不是插入; 如果没有
$cdir:$cwd
, 会放在末尾;查看搜索目录值
尾插法; 如果
from
存在类似更新, 但是会删除原from
再尾插新的from to
;
匹配: 第一个发现则停止;
须知: 可能因为先后顺序,from
存在子目录, 则可能导致错误修改带来的bug
;
path
删除对应, 没有警告; 没有path
删除所有;
path
是from
,path
查看对应的规则, 没有警告; 无path
查看所有;