addr2line 的反转
Reverse of addr2line
给定目标文件和地址,addr2line 工具可以将其与源代码中的文件和行号相关联。
我想要相反的。给定行号和目标文件,我想获得与源代码中给定行对应的指令地址列表。
我知道我可以使用 objdump -DS 来查找一行,但是那样不方便,并且需要手动过滤地址。如果我给它一个行列表,你知道有什么工具可以做我想做的事吗?
UPD.
我举个我想要的例子
我有一组文件行:
src/a.c:14
src/a.c:28
src/b.c:44
我将此列表传递给工具:
cat lines | line2addr -e lib.so
它向我报告了这些行的指令地址:
0x442: src/a.c:14
0x444: src/a.c:14
0x44a: src/a.c:14
0x584: src/a.c:28
0x588: src/a.c:28
...
仔细阅读documentation of GDB。如果您的可执行文件是使用调试信息构建的(所有代码都是使用 -g
编译的),您可以使用
stack related commands, machine code related 命令等
我不确定是否理解您的愿望,但我想 dis
和 x
命令可能会有所帮助
此外,最近的 GDB 可在 Python 和 Guile 中编写脚本。
以实用方式执行此操作的方法是使用以下 GDB cmd 行:
gdb ../main.o -ex "info line main.c:39" --batch
Line 39 of "main.c" starts at address 0x36 <main+54> and ends at 0x5e <main+94>.
GDB 接受对象或使用调试信息编译的可执行文件 (-g)
。使用 GDB 7.6 及更高版本。早期版本在加载目标文件时 Windows 崩溃。
通过多次应用 -ex
开关可以翻译多行:
gdb ../main.o -ex "info line main.c:39" -ex "info line main.c:41" --batch
Line 39 of "main.c" starts at address 0x36 <main+54> and ends at 0x5e <main+94>.
Line 41 of "main.c" starts at address 0x5e <main+94> and ends at 0x70 <main+112>.
给定目标文件和地址,addr2line 工具可以将其与源代码中的文件和行号相关联。
我想要相反的。给定行号和目标文件,我想获得与源代码中给定行对应的指令地址列表。
我知道我可以使用 objdump -DS 来查找一行,但是那样不方便,并且需要手动过滤地址。如果我给它一个行列表,你知道有什么工具可以做我想做的事吗?
UPD.
我举个我想要的例子
我有一组文件行:
src/a.c:14
src/a.c:28
src/b.c:44
我将此列表传递给工具:
cat lines | line2addr -e lib.so
它向我报告了这些行的指令地址:
0x442: src/a.c:14
0x444: src/a.c:14
0x44a: src/a.c:14
0x584: src/a.c:28
0x588: src/a.c:28
...
仔细阅读documentation of GDB。如果您的可执行文件是使用调试信息构建的(所有代码都是使用 -g
编译的),您可以使用
stack related commands, machine code related 命令等
我不确定是否理解您的愿望,但我想 dis
和 x
命令可能会有所帮助
此外,最近的 GDB 可在 Python 和 Guile 中编写脚本。
以实用方式执行此操作的方法是使用以下 GDB cmd 行:
gdb ../main.o -ex "info line main.c:39" --batch
Line 39 of "main.c" starts at address 0x36 <main+54> and ends at 0x5e <main+94>.
GDB 接受对象或使用调试信息编译的可执行文件 (-g)
。使用 GDB 7.6 及更高版本。早期版本在加载目标文件时 Windows 崩溃。
通过多次应用 -ex
开关可以翻译多行:
gdb ../main.o -ex "info line main.c:39" -ex "info line main.c:41" --batch
Line 39 of "main.c" starts at address 0x36 <main+54> and ends at 0x5e <main+94>.
Line 41 of "main.c" starts at address 0x5e <main+94> and ends at 0x70 <main+112>.