linux-AVM调试【1】

本文档详细介绍了Linux AVM系统的编译过程,包括如何编译整个系统包和单个文件,修改配置文件,手动替换程序包以及抓取log信息。主要涉及的目录和文件有AVM_UI、GenAvmLUT、traj等,对于调试和升级至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、如何编译整个系统包

    cd  /返回根目录  cd ..返回上一级目录    cd ~返回home;

     进入sphe6700目录下 执行make命令;编译生产的包在out_binary下(系统包);

     系统包升级(程序包烧录):编译6700 sdk包生成out_binary目录,将内容复制到u盘内,开发板接上短路帽及u盘,重启后系统自动升级,接荧幕会自动显示升级进度条。升级后请摘除短路帽,reboot重启开发板。

 

二、如何编译单个文件

       cd进入Samplecode目录下i2c_to_shm_john目录下,执行make命令,生产i2c_to_shm文件

三、改配置文件

       int_6700.sh

       pgs.cfg 倒车轨迹线起始位置坐标

       AVM_UI目录下layout.cfg文件(画面大小)/GenAvmLut目录下也有layout.cfg文件,请确定which one再改;

       CETICID:读板子ID(执行这个函数)

四、手动替换程序包
pc 安装xshell程序,与开发板通过uart线连接,使用相关cmd进行复制操作。
例如,替换bin包,使用指令

<think>我们被要求解释addr2line命令的参数-Cfie,并演示如何解析vmlinux文件中特定地址0xFFFFFFC0090C16A4。 首先,addr2line是一个将程序地址转换为文件名和行号的工具,常用于调试。 参数解释(注意:参数可以合并,如-Cfie): -C, --demangle[=style]:将低级别的符号名解码为用户级别的名字,特别用于C++中混淆(mangled)的名字。对于C代码,此选项可能没有明显效果,但建议保留。 -e, --exe=<executable>:指定可执行文件(这里就是vmlinux)。 -f, --functions:在显示文件名和行号的同时,显示函数名称。 -i, --inlines:如果需要,显示内联函数调用。当代码被内联优化时,一个地址可能对应多个调用点(内联链),这个选项会显示所有内联函数。 注意:参数顺序不重要,但必须指定-e和要转换的地址。 现在,我们要解析vmlinux文件中的地址0xFFFFFFC0090C16A4。 步骤: 1. 确保你有带有调试信息(编译时加上-g选项)的vmlinux文件。 2. 使用命令: addr2line -e vmlinux -f -i -C 0xFFFFFFC0090C16A4 如果地址正确且调试信息存在,命令将输出函数名、文件名和行号。 示例输出可能如下: mmc_blk_mq_issue_rq /path/to/linux/drivers/mmc/core/block.c:1234 如果地址无效或没有调试信息,可能输出: ?? ??:0 注意:由于地址0xFFFFFFC0090C16A4是一个64位地址,在内核中通常是直接可用的(在vmlinux的符号地址范围内)。 关于地址0xFFFFFFC0090C16A4的说明: - 这个地址看起来是一个内核虚拟地址,通常在内核崩溃日志中看到。 - 在启用KASLR的情况下,这个地址可能是随机化的,但vmlinux中的符号地址也是按照同样的随机偏移调整过的(前提是vmlinux与运行的内核匹配)。 重要:必须使用与产生该地址的内核完全匹配的vmlinux文件,否则解析会失败。 如果地址在模块中,则需要使用模块的.ko文件(但这里指定了vmlinux,所以假设该地址在vmlinux中)。 现在,我们给出一个完整的命令示例: addr2line -e /path/to/vmlinux -f -i -C 0xFFFFFFC0090C16A4 如果希望更简洁的输出(不显示函数名,则去掉-f;不需要内联信息,则去掉-i),但通常调试内核问题时需要这些信息。 相关问题: 1. 如何获取与当前运行内核匹配的vmlinux文件? 2. 当addr2line输出??时如何排查? 3. 如何解析内核模块中的地址? 4. 如何批量解析内核崩溃日志中的多个地址?</think>### addr2line 命令参数详解与 vmlinux 地址解析 #### addr2line 关键参数说明 | 参数 | 全称 | 作用 | 使用场景示例 | |------|------|------|-------------| | `-C` | `--demangle` | 解码 C++ 混淆符号 | 解析 C++ 内核模块时必需 | | `-f` | `--functions` | 显示函数名称 | 定位具体函数位置 | | `-i` | `--inlines` | 显示内联函数信息 | 分析优化后的代码路径 | | `-e` | `--exe` | 指定目标文件 | `-e vmlinux` 指定内核文件 | | `-p` | `--pretty-print` | 人性化输出格式 | 提高可读性(推荐) | #### 解析地址 `0xFFFFFFC0090C16A4` 的步骤 1. **准备调试环境** 确保 vmlinux 文件与内核版本匹配: ```bash uname -r # 查看运行内核版本 file vmlinux # 确认文件架构 ``` 2. **执行解析命令** ```bash addr2line -e vmlinux -f -i -C -p 0xFFFFFFC0090C16A4 ``` 3. **解析结果示例** 成功输出格式: ``` mmc_blk_mq_issue_rq at drivers/mmc/core/block.c:1865 (inlined by) mmc_queue_rq at drivers/mmc/core/queue.c:422 ``` 失败输出: ``` ??:? ``` 4. **常见问题排查** - **版本不匹配**:使用 `grep CONFIG_LOCALVERSION /boot/config-$(uname -r)` 确认构建 ID - **调试信息缺失**:检查 `readelf -S vmlinux | grep debug` 确保存在 `.debug_info` 段 - **地址无效**:验证地址是否在符号范围内 `nm vmlinux | grep __start_rodata` #### 技术说明 1. 地址 `0xFFFFFFC0090C16A4` 是 ARM64 内核的典型虚拟地址(高 16 位 `0xFFFFFFC0` 表示内核空间) 2. `-i` 参数对优化内核特别重要,因为 90% 的内核函数可能被内联[^1] 3. 解析依赖 DWARF 调试格式,其结构为: ```mermaid graph LR A[.debug_info] --> B[编译单元] B --> C[函数DIEs] C --> D[行号信息] D --> E[具体文件:行号] ``` #### 完整命令示例 ```bash # 带错误检查的解析 if ! addr2line -e vmlinux -p 0xFFFFFFC0090C16A4; then echo "解析失败!请检查:" echo "1. vmlinux 版本匹配性 (当前内核: $(uname -r))" echo "2. 调试信息存在性: $(readelf -S vmlinux | grep -c debug_info)" fi ``` > **提示**:对于 Android 内核,使用交叉编译工具链中的 `aarch64-linux-android-addr2line`,并确保 vmlinux 包含 `.debug_line` 段[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值