程序段错误调试

一次MIPS架构嵌入式程序段错误调试过程

一个遗留的程序跑了一段时间就报:
Segmentation fault

本文章记录如何从内核输出的信息中查找是那个函数导致段错误的函数。

程序报错

程序tt_tf运行一段时间,报错停止:

[2] - Segmentation fault ./tt_tf

查看错误信息

输入dmesg命令,查看错误信息。

[root@Ingenic-uc1_1:~]# dmesg
[root@Ingenic-uc1_1:~]#[52896.532262] do_page_fault(): sending SIGSEGV to rr_tf for invalid read access from 00000000
[root@Ingenic-uc1_1:~]#[52896.532278] epc = 778aec88 in libuClibc-0.9.33.2.so[77872000+a9000]
[root@Ingenic-uc1_1:~]#[52896.532309] ra = 77cc2a6c in libttdb.so[77cc1000+6000]

从错误信息可以看出是libttdb.so库中的函数内存访问异常了。

反汇编

在代码编译环境中反汇编libttdb.so。

rr@rr-PowerEdge:/home/rr/$mips-linux-uclibc-objdump -d libttdb.so >ttdb_dump.txt

查找导致段错误的函数

根据错误信息中的:
> ra = 77cc2a6c in libttdb.so[77cc1000+6000]
得出地址 0x1a6c(0x77cc2a6c - 0x77cc1000 = 0x1a6c),在反汇编的输出文件(ttdb_dump.txt)中查找该地址(1a6c)。

790 1a38: 1840000e blez v0,1a74 <get_old_filename+0x184>
791 1a3c: 8f998074 lw t9,-32652(gp)
792 1a40: 8f848028 lw a0,-32728(gp)
793 1a44: 8f9980ec lw t9,-32532(gp)
794 1a48: 8fc50004 lw a1,4(s8)
795 1a4c: 0320f809 jalr t9
796 1a50: 24843eac addiu a0,a0,16044
797 1a54: 8fbc0018 lw gp,24(sp)
798 1a58: 8fbe00c0 lw s8,192(sp)
799 1a5c: 02002025 move a0,s0
800 1a60: 8f9980f0 lw t9,-32528(gp)
801 1a64: 0320f809 jalr t9
802 1a68: 8fc50004 lw a1,4(s8)
803 1a6c: 8fbc0018 lw gp,24(sp)
804 1a70: 8f998074 lw t9,-32652(gp)

该地址在函数get_old_filename中,即在该函数中某个地方导致的段错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
错误是一种常见的错误类型,通常是由于访问无效的内存地址引起的。在调试 Linux 驱动程序时遇到段错误,可以按照以下步骤进行排查和解决: 1. 确认段错误的位置:可以使用调试工具(如 gdb)来定位段错误发生的位置。通过在代码中插入调试语句或设置断点,可以逐步执行程序并观察在哪个特定的代码行发生段错误。 2. 检查指针和数组:段错误通常与指针或数组的访问有关。确保您的指针已正确初始化并分配了内存。检查数组的索引是否超出了范围,并避免访问已释放的内存。 3. 检查内存分配和释放:如果您使用动态内存分配函数(如 malloc 或 kmalloc),请确保在使用完内存后进行适当的释放(free 或 kfree)。内存泄漏可能导致内存耗尽或无效的内存访问。 4. 检查函数参数和返回值:确保函数参数的类型和数量与函数声明匹配,并正确处理函数的返回值。传递无效的参数或对未初始化的返回值进行操作可能导致段错误。 5. 检查系统调用和驱动接口:如果您的驱动程序使用系统调用或与其他模块或设备进行交互,请确保正确处理错误情况和无效的参数。使用适当的错误处理机制,如返回适当的错误代码或设置错误标志。 6. 使用调试工具:除了 gdb 之外,还可以使用其他调试工具,如 Valgrind(用于检测内存错误)或 Ftrace(用于跟踪函数调用和内核事件)。这些工具可以帮助您更详细地分析和定位段错误。 7. 重现和记录问题:尝试重现段错误,并记录相关的环境、输入或操作。这将有助于更深入地分析问题并找到解决方案。 请注意,以上步骤只是一些常见的排查方法,具体的解决方案可能因问题的具体情况而异。如果问题仍然存在,请尝试搜索相关的文档、论坛或寻求其他开发者的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jason.rr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值