前景
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查看所有;
4857

被折叠的 条评论
为什么被折叠?



