自 v1.5 版之后更名为“函数查找工具”,原名称为“栈分析工具” / “栈数据分析工具” 。
工具介绍
根据gcc/mdk/iar/ccs等编译器产生的elf格式文件(linux、嵌入式等主要采用elf格式),计算出函数地址对应的函数(名)及相应的代码位置(文件及行号)。因此可以利用异常时的pc地址获取触发异常的函数(名),也可利用完整的栈数据回溯异常时的函数调用。
支持32位/64位elf文件自适应解析、支持高dpi显示、支持窗口伸缩。
1. 查找函数名
* 输入地址后,点击“计算”按钮,即可获取对应的名称。查找到的函数地址使用红色字体显示。
2. 显示行号
* 选中“行号”(默认已选择),点击“计算”。函数名后显示 [源文件 : 行号]
3. 查找变量
* 选中“数据”,点击“计算”。查找到的变量地址使用绿色字体显示。
4. 严格判断函数归属
—— (更改为)确保地址在该函数范围内(适用于C语言等高级语言编写的函数,不适用于汇编函数)
最新版下载地址:
更新日志
v1.7 —— 2024.5
通过工程方法彻底解决在部分场景下路径显示以及行号计算不准的问题,并显示完整路径。
1. 增加解析结果输出功能,用于大批量测试。(内部功能)
2. 编写shell测试脚本进行规模化测试,根据保存的解析结果进行大批量测试。
3. 基于dwarf version3、 version4、 version5以及混合编译的elf进行测试,测试100w+以上的函数解析,均无误。
MD5: 0B8311B7A83ABBC9B8E784D0DA1E3148
SHA1: 754F5FF5F7EE728E0DDA4B05761ADC8BD29626AE
CRC32: DE01737D
v1.6 —— 2022.10
1. 优化提升处理效率。
2. 修改“严格”选项作用,由之前的“地址相等”改为“严格确保在该符号范围内”。
3. 优化重复地址的符号处理,按照内置策略优先查找“强”符号。
4. 优化操作体验:支持文件拖拽、支持高dpi自适应显示。
========= 特色功能 ========
5. 完善变量查找。
6. 新增“函数-行号”解析功能。
MD5: 63B4FAF7092A44722E5CCB45E04A716C
SHA1: F1F2F674E270AEF4A0388F64600DE0F6B641ECDA
CRC32: B43923D9
2023.10 重新更新
1. 解决部分情况下目录路径错误的问题。
MD5: 9DEF95C91CB513D08DBC259CA3E686F0
SHA1: A76426EA646984A914FF763D9D283FE84A212CB3
CRC32: 402E3292
v1.5 —— 2021.9
自适应解析32位、64位elf。
完善64位高地址解析及查找等。
内部优化
v1.4 —— 2021.1
支持64位elf解析
完善高亮彩色显示
内部优化
v1.3 —— 2018.12
根据DSP/CCS、ARM/MDK 编译的out/axf的elf格式文件,计算出函数地址对应的函数(名)。因此可利用DSP/ARM异常时的栈数据获取异常时函数记录,从而回溯异常时的函数调用。
v1.2 —— 2017.3
内部使用
v1.1 —— 2016.10
内部版本
v1.0 —— 2016.6
内部使用
测试记录:
v1.7 测试记录:
基于J5 linux 内核进行压力测试(修改kernel makefile的编译选项,使vmlinux.elf增加dwarf调试信息),从dwarf中总计解析1,317,322(131万+)个函数地址:
1. 因addr2line返回"??",跳过比较的函数15个。
2. 因addr2line无法解析行号,“认为解析错误”的函数6个 —— 属机械化误判定。
3. 完全匹配的函数地址1317301个。
测试结论:工具的dwarf解析能力与addr2line几乎完全一致,行号解析准确性略高于addr2line。
基于app、C库、dsp等不同版本程序,不同版本gcc进行编译的elf,不同版本的dwarf信息进行测试,测试结论一致。
================================================================
备注:
“工具” 为工具解析的记录。
“addr” 为 addr2line解析的结果。
以下为压力测试log:
1 地址: 0xffff800010886dc4 跳过比较
1 错误地址: 0xffff80001088ef2c
工具: /workspace/linux/J5/source-j52-master-1018/sdk/code/kernel/arch/arm64/kernel/insn.c:114
addr:insn.c:?
2 地址: 0xffff80001088f04c 跳过比较
3 地址: 0xffff80001088a774 跳过比较
4 地址: 0xffff80001007888c 跳过比较
5 地址: 0xffff80001088c52c 跳过比较
6 地址: 0xffff8000100a5c28 跳过比较
2 错误地址: 0xffff80001088d454
工具: /workspace/linux/J5/source-j52-master-1018/sdk/code/kernel/kernel/time/hrtimer.c:1933
addr: hrtimer.c:?
7 地址: 0xffff8000100b3e54 跳过比较
8 地址: 0xffff80001016cb68 跳过比较
9 地址: 0xffff8000101f6580 跳过比较
10 地址: 0xffff800010221c10 跳过比较
11 地址: 0xffff80001028ea24 跳过比较
12 地址: 0xffff8000102d8a20 跳过比较
13 地址: 0xffff8000102ea5b0 跳过比较
14 地址: 0xffff8000103eb058 跳过比较
3 错误地址: 0xffff800010890a30
工具: /workspace/linux/J5/source-j52-master-1018/sdk/code/kernel/drivers/irqchip/irq-gic-v3.c:669
addr: irq-gic-v3.c:?
4 错误地址: 0xffff8000105faadc
工具: /workspace/linux/J5/source-j52-master-1018/sdk/code/kernel/drivers/media/mc/mc-device.c:371
addr: mc-device.c:?
5 错误地址: 0xffff8000107b10d4
工具: /workspace/linux/J5/source-j52-master-1018/sdk/code/kernel/net/netfilter/nfnetlink_log.c:649
addr: nfulnl_log_packet
nfnetlink_log.c:?
6 错误地址: 0xffff80001088917c
工具: /workspace/linux/J5/source-j52-master-1018/sdk/code/kernel/net/ipv4/route.c:3515
addr: route.c:?
15 地址: 0xffff800010864498 跳过比较
成功: 1317301
失败: 6 addr2line出现解析不完整,此时工具完整解析。
跳过: 15 addr2line返回"??",无法解析,此时工具成功解析。