利用脚本-一键导出段错误的函数反汇编

博客围绕 Linux 服务器运维展开,虽未给出具体内容,但可知涉及 Linux 系统在服务器运维方面的相关知识,属于信息技术中基础运维领域。

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

#!/bin/bash

#利用本工具查看段错误函数的反汇编,定位到出错的行号; 工具入参前两个必填,第3个可选, <二进制可执行文件>  <发生段错误的函数>  [出错位置的偏移]
function print_help() {
    echo "use: this_tool  <bin> <func | addr>  0x[offset]"
    echo "       ex 1. core_dump.sh  a.out  main    1c      ---> number 1c means 0x1c"
    echo "       ex 2. core_dump.sh  bin    400e0   9       ---> number 400e0  means func addr"
    #echo "ex.  : this_tool.sh  <bin> <func>"
    exit 1
}

if [ $1 = "--help" ] ; then
    print_help
fi

#if [ $ -ne 2 ] ; then
if [ $# -lt 2 ] ; then
    print_help
fi

bin=$1
func=$2

_strip=`file $bin | grep "not stripped"`
if [ "$_strip" = "" ] ; then
    echo "is stripped."
else
    echo "not stripped."
fi

debug=`readelf -S $bin | grep debug_ | wc -l`
if [ $debug = "0" ] ; then
    echo "have not debug_info."
else
    echo "have $debug debug."
fi

#result_start=`nm -n $bin | grep $func | grep -e "[T|B] " `   #临时测试结束end
result_start=`nm -n $bin | grep $func | grep "T " `
num=`nm -n $bin | grep $func | grep "T " | wc -l `
#number=`$result_start | wc -l`
#echo "$number"
#if [ "$result_start" = "" ] ; then
if [ $((num)) -eq 0 ] ; then
    echo "$func not found."
    exit 1
elif [ $((num)) -gt 1 ] ; then
    echo "***Here have more than once match.***"
    echo "$result_start" | c++filt
    start_addr=`echo -n $result_start | awk '{print $1}' `
    echo "***please choose one, such as first line: $0 $1 $start_addr"
    exit 1
fi

echo "***start: $result_start" | c++filt
start_addr=`echo -n $result_start | awk '{print $1}' `
#func_name=`echo -n $result_start | awk '{print $3}' `
#echo $start_addr
let "left = 0x$start_addr "

end_addr=`nm -n $bin | grep $start_addr -A1 | sed "1d" | awk '{print $1}' `
if [ "$end_addr" = "" ] ; then
    echo " have not end_addr."
    #((tmp=16#$start_addr))
    #end_addr=`echo "ibase=10 ; obase=16 ; $tmp + 1" | bc `
    end_addr=`echo "obase=16 ; $left + 1 " | bc `
fi
echo "***end  : $end_addr"

#m=`expr $left + 1`	; echo "m:$m"
#let "m=0x11" ; echo $m ; let "n=0x10" ; echo "ibase=16 ; obase=16 ; $m + $n" | bc	#结果02 01即就是0x21
if [ $3 ] ; then
    #((tmp2=16#$start_addr))
    #offset=`echo "ibase=16 ; obase=16 ; (($tmp2 + 0x$3))" | bc `
    let "off = 0x$3" #; echo $offs
    offset=`echo "obase=16 ; $left + $off " | bc `
fi
echo "***offset: ${offset,,}"

outfile=dump_func.log
echo -e "\n*****begin*****$start_addr**" >> $outfile
date >> $outfile
objdump -lS $bin --start-address=0x$start_addr --stop-address=0x$end_addr >> $outfile
echo -e "******end******$end_addr**\n" >> $outfile
#cat $outfile
echo -e "***output file:    $outfile\ndone."

<think>好的,用户现在问的是“劳特巴赫中的dump”,需要我用中文回答。首先,我需要确认“劳特巴赫”在这里指的是什么。劳特巴赫可能指的是Lauterbach,一家德国的公司,专门做调试工具,比如TRACE32之类的。所以用户可能是在问使用Lauterbach的调试工具进行内存转储(dump)的操作。 接下来,我需要回忆一下Lauterbach TRACE32的相关知识。内存转储通常是指将目标设备的内存内容保存到文件中,用于后续分析,比如调试崩溃、分析程序状态等。TRACE32作为专业的调试工具,肯定有相关的命令和功能来支持这一点。 用户可能是一个嵌入式开发人员,正在使用TRACE32进行调试,遇到了需要保存内存数据的情况。他可能想了解如何操作,或者dump的具体步骤、命令是什么。也有可能用户遇到了内存相关问题,需要转储来分析问题,比如查找内存泄漏、数据损坏等。 我需要先介绍什么是Lauterbach TRACE32中的dump,然后说明常见的dump类型,比如内存dump、寄存器dump、符号表dump等。然后给出具体的操作步骤,包括使用的命令,比如Data.dump、Register.dump等,可能还需要提到如何保存到文件,以及文件格式如二进制、hex、srec等。 另外,用户可能想知道dump的应用场景,比如在调试崩溃时保存现场数据,或者进行性能分析时的内存快照。同时,需要注意权限问题,确保访问的内存区域是允许的,以及地址范围的正确性,避免转储错误的数据。 可能还需要提到一些高级功能,比如脚本自动化执行dump操作,或者结合其他TRACE32功能进行分析。例如,使用Practice脚本编写自动化任务,定期转储内存,或者在断点触发时自动保存寄存器状态。 要确保回答结构清晰,分点说明,让用户能一步步理解。同时,需要避免使用过于专业的术语,或者适当解释术语,确保用户即使对TRACE32不太熟悉也能理解。例如,解释什么是符号表,为什么需要转储符号表等。 最后,要检查是否有遗漏的重要点,比如不同架构处理器的差异,或者TRACE32版本之间的命令变化,是否需要参考具体手册等。可能需要建议用户查阅官方文档或联系支持,以应对特殊情况。 总结下来,回答的结构应该是:定义dump在Lauterbach中的含义,常见类型,操作步骤,应用场景,注意事项,以及可能的扩展功能。这样用户能全面了解如何利用TRACE32进行内存转储,解决实际问题。</think>嵌入式开发和调试中,**劳特巴赫(Lauterbach)** 的调试工具(如 **TRACE32**)被广泛用于硬件调试、代码分析和系统诊断。其中的 **Dump** 操作是指将目标设备(如 MCU、SoC)的**内存内容**或**寄存器状态**以特定格式导出到文件或显示在调试界面中,以便开发者分析问题(如崩溃、数据错误等)。以下是详细介绍: --- ### **1. Dump 的核心功能** 在 Lauterbach TRACE32 中,**Dump** 主要用于以下场景: - **内存转储**:将指定内存地址范围的数据导出为二进制、十六进制或其他格式文件。 - **寄存器快照**:保存 CPU 核心寄存器、外设寄存器的当前值。 - **调试状态捕获**:记录程序崩溃、异常触发时的系统状态(如堆栈、变量值)。 - **符号表导出**:导出调试符号信息(如函数地址、变量名)。 --- ### **2. Dump 的常见类型** #### **(1) 内存转储(Memory Dump)** - **用途**: 分析内存数据(如全局变量、堆栈内容)、验证 Flash 写入结果、检查内存泄漏。 - **命令示例**: ```t32 Data.dump <起始地址> <结束地址> /Format <格式> /File <文件名> ``` - **格式**:`BINARY`(二进制)、`HEX`(十六进制)、`ASCII`、`Motorola S-Record` 等。 - **示例**: 将 `0x20000000` 到 `0x2000FFFF` 的 RAM 内容转储为二进制文件: ```t32 Data.dump 0x20000000--0x2000FFFF /Format BINARY /File "ram_dump.bin" ``` #### **(2) 寄存器转储(Register Dump)** - **用途**: 捕获 CPU 核心寄存器(如 PC、SP、LR)或外设寄存器(如 GPIO、UART)的实时值。 - **命令示例**: ```t32 Register.dump /ALL /File "registers.txt" // 保存所有寄存器到文件 Register.view // 直接在界面显示寄存器值 ``` #### **(3) 符号表转储(Symbol Dump)** - **用途**: 导出调试符号(变量名、函数地址),用于离线分析或逆向工程。 - **命令示例**: ```t32 SYStem.DOWNLOAD.Symbol /FILE "symbols.sym" ``` -- ### **3. Dump 的操作流程** 以 **内存转储** 为例,典型步骤为: 1. **连接目标设备**:通过 JTAG/SWD 连接调试器与芯片。 2. **暂停目标程序**:触发断点或手动暂停,确保内存数据静止。 3. **执行 Dump 命令**:指定地址范围和输出格式。 4. **分析数据**:使用工具(如 Hex 编辑器、IDA Pro)解析导出的文件。 --- ### **4. 应用场景** - **崩溃分析**:程序崩溃时,Dump 内存和寄存器,定位异常地址或数据损坏。 - **数据验证**:检查 Flash 是否成功写入固件,或外设配置是否正确。 - **逆向调试**:通过 Dump 内存片段,逆向分析第三方代码或协议。 - **自动化测试**:通过脚本(TRACE32 Practice 脚本)定期 Dump 关键数据。 -- ### **5. 注意事项** - **地址有效性**:确保目标地址可访问(避免访问保留区域或未映射地址)。 - **数据对齐**:某些硬件要求按字(Word)或块(Block)读取,需遵守对齐规则。 - **权限限制**:部分内存可能受 MPU/MMU 保护,需先配置调试权限。 - **实时性**:Dump 操作会暂停目标程序,可能影响实时系统行为。 -- ### **6. 扩展功能** - **差异 Dump**:仅导出两次内存快照之间的差异部分(节省存储空间)。 - **脚本自动化**:通过 TRACE32 Practice 脚本实现一键 Dump: ```t32 PRACTICE脚本示例: LOCAL &start_addr 0x20000000 LOCAL &end_addr 0x2000FFFF Data.dump &start_addr--&end_addr /Format HEX /File "auto_dump.hex" ``` -- ### **总结** Lauterbach 的 **Dump** 功能是硬件调试的核心工具之一,能快速捕获系统状态并导出为可分析的文件格式。结合 TRACE32 的其他功能(如反汇编、断点、Trace 跟踪),可显著提升复杂嵌入式问题的诊断效率。具体命令需根据目标芯片架构(ARM、RISC-V、PowerPC 等)和调试需求调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值