作者lihgong (当宪兵是我一辈子的耻辱)
看板ASM
标题[闲聊] 用组合语言 debug
时间Sat Nov 14 22:04:00 2009
在我们的系统(ARM)里, 存取记忆体位址 0~4k 的位置
CPU 会赏一个 memory access exception 给你
这个机制用到了 CPU 的 MMU, 把某个记忆体区段设成 invalid (0~4k)
Exception 触发以後, 进入 interrupt
只要把 interrupt handler 设定成无穷回圈, CPU 就死在那里
所以现在 CPU 埋了这个地雷了, 程式设计师的任务是:
在踩到地雷时, 找出在哪里出事
----
运气好的时候, 出事的位置看得到 source code
只要看看 Link Register 附近的程式码, 就知道位置了
运气不好的时候, 出事的位置是 library, 比如 memcpy() 这样的函数
这个 case 要定位, 需要一点技巧...
----
呼叫函数的时候, 会把 Return address 和参数陆续堆到 stack 之上
debug 的概念很简单, 顺着 stack 往"上"找
ps. 看系统, stack 是往记忆体低的地方找, 就是往记忆体位址高的地方找
每个数值都去记忆体看看, 用 dis-assembler 看看对应的指令, symbol
我的经验是挖个几层, 通常就有结果了 :D
找到出事的地方, 再顺着指令, 找找 LDR/ STR 这类的指令, 看看是哪个关键错了
之後就能用 C level 处理 bug
----
ps.
我很少用这招, 通常是有人搞爆, 但没人觉得自己写错
真的没招, 非得找出问题才用
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.160.90.237
1F:推 SILee:GDB直接下info stack就可以直接看到这些资讯了 11/14 22:08
2F:推 zhim:不能用handler直接回报谁触发的吗? 12/05 00:44