ios控制台利用gdb命令查看报错堆栈

本文介绍了在iOS开发过程中如何处理提前释放指针导致的程序崩溃问题。通过使用debug模式和控制台bt命令来获取崩溃堆栈信息,进而准确定位错误发生的位置及原因。

下文来自http://wangjun.easymorse.com/?m=201103&paged=2

在ios开发中,如果提前释放一个指针的内存,在以后还继续使用这个指针,那么程序会立刻crash掉,而且很难有报错信息,我以前都是靠猜测去判断错误的原因,我们应该利用工具去找到错误的地方,然后快速准确的定位到错误地方,及其错误原因,最后进行改进。

其实ios控制台,提供这种机制,如果你选择debug模式,在程序crash之后,在控制台输入bt,就可以显示crash堆栈:

Program received signal:  “EXC_BAD_ACCESS”.    
warning: Unable to read symbols for /Developer/ios4.2.1/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found).     
(gdb) bt     
#0  0x33a06464 in objc_msgSend ()     
#1  0x3139de2e in -[UIImageView setImage:] ()     
#2  0x00009ecc in -[RoundMenuView touchesEnded:withEvent:] (self=0x29e140, _cmd=0x316b1a7b, touches=0x2e1050, event=0x2424f0) at /Users/wangjun/workspace/iphone/Classes/RoundMenuView.m:130     
#3  0x313b1354 in -[UIWindow _sendTouchesForEvent:] ()     
#4  0x313b0cce in -[UIWindow sendEvent:] ()     
#5  0x3139bfc6 in -[UIApplication sendEvent:] ()     
#6  0x3139b906 in _UIApplicationHandleEvent ()     
#7  0x31eecf02 in PurpleEventCallback ()     
#8  0x304236fe in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()     
#9  0x304236c2 in __CFRunLoopDoSource1 ()     
#10 0x30415f7c in __CFRunLoopRun ()     
#11 0x30415c86 in CFRunLoopRunSpecific ()     
#12 0x30415b8e in CFRunLoopRunInMode ()     
#13 0x31eec4aa in GSEventRunModal ()     
#14 0x31eec556 in GSEventRun ()     
#15 0x313cf328 in -[UIApplication _run] ()     
#16 0x313cce92 in UIApplicationMain ()     
#17 0x00002da2 in main (argc=1, argv=0x2fdff44c) at /Users/wangjun/workspace/iphone/main.m:19     
kill     
quit

利用堆栈信息,就可以准确的定位到错误地方。

 

### 在 GDB查看 CoreDump 堆栈附近的内存和寄存器信息 当使用 GDB 打开一个核心转储 (coredump) 文件时,可以借助多种命令来深入分析程序崩溃的原因。以下是关于如何查看堆栈附近内存和寄存器状态的具体方法。 #### 查看寄存器状态 为了获取程序崩溃时刻的寄存器值,可使用以下命令: - **`info registers` 或者简写为 `i r`**:此命令会列出所有通用寄存器、浮点寄存器以及控制寄存器等内容及其当前值[^1]。 例如: ```bash (gdb) info registers rax 0xdeadbeef 3735928559 rbx 0xcafecafe 3405691582 ... rip 0x4005e6 0x4005e6 <main+6> rsp 0x7fffffffeabc 0x7fffffffeabc ``` 这里展示的是各个主要寄存器在崩溃瞬间的状态,特别是指令指针 (`rip`) 和栈指针 (`rsp`) 对理解问题至关重要。 #### 查看堆栈附近的内存 要检查某个特定位置周围的内存情况,可以用到之前提到过的 `x` 命令。例如,如果我们想围绕栈顶(`rsp`) 来探索更多细节,则输入类似于下面这样的语句即可实现目的: - **`x/16wx $rsp`** : 显示从 rsp 开始向后的十六个四字节宽度的数据项; - 更改参数数量如改为更少或多些项目数以适应需求;调整显示格式字母 w 替换成 b(字节),h(半字),g(八字组)[^3]. 假如已知某段可疑代码涉及地址空间位于某一范围内,还可以直接指定绝对地址来进行探测。比如怀疑问题发生在地址 `0x00007fff5fbff8c0` 处,那么就可以这样操作: ```bash (gdb) x/16wx 0x00007fff5fbff8c0 ``` #### 结合反汇编功能进一步排查 除了单纯依赖原始数据外,配合 disassemble 功能往往能带来额外收获。它能够把机器码翻译成人可读的形式——汇编语言表达式,从而帮助我们更好地解读那些难以捉摸的行为背后隐藏的秘密。 - **`disas/r $pc`**: 展现当前 PC(Program Counter)指向处的一小段汇编代码,并附带其对应的机器码表示[^5]. 综上所述,在面对复杂场景下仅靠单一手段或许不足以解决问题之时,灵活运用上述技巧组合出击往往会事半功倍! ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值