iOS-compile_debug-debug_skill

本文将介绍如何通过增加环境变量NSZombieEnabled和MallocStackLogging来捕获和分析Objective-C中的EXC_BAD_ACCESS错误。同时,提供使用gdb进行调试的步骤和技巧,包括如何利用shell命令获取崩溃时的内存地址和pid信息。此外,还会展示如何在调试过程中使用arm汇编进行深入分析。最后,文章强调了在调试完成后移除环境变量的重要性,确保发布版本的稳定性。

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

1. EXC_BAD_ACCESS
对于这种问题,
1、增加NSZombieEnabled和MallocStackLogging环境变量:菜单Product--》Edit Scheme...,在弹出的窗口上方选择自己的项目及模拟器,左侧选择"Run ***.app"(***是你的项目名称),右侧选择Arguments选项卡,在Environment Variables中增加Name: NSZombieEnabled--》Value:YES、 Name: MallocStackLogging--》Value:YES,并点击2个环境变量左侧的复选框,保证在启用状态。
2. 在控制台的(gdb)后面输入shell malloc_history 1431 0x7245470(其中1431和0x7245470是log中的pid和address),并回车。得到可用信息。
需要使用gdb来调试。




2.使用arm汇编


3.
break malloc_error_break
c
po
print
shell malloc_history pid addr
bt




NSZombieEnabled设置为YES(或Enable Zombie Objects打勾)后,所有释放的对象都变成僵尸对象,当再次向僵尸对象发送消息时就会定位到崩溃的位置。这个设置只能在调试时使用,因为并没有真正释放内存,发布版本要去掉。
### 配置 `catkin_make` 生成 `compile_commands.json` 为了使 `catkin_make` 能够生成 `compile_commands.json` 文件,可以通过传递参数给底层的 CMake 工具来实现这一目标。具体来说,CMake 提供了一个选项 `-DCMAKE_EXPORT_COMPILE_COMMANDS=ON`,用于启用编译命令文件的导出功能[^1]。 以下是具体的配置方法: #### 设置环境变量或直接调用 在执行 `catkin_make` 命令时,可以直接附加上述 CMake 参数。例如,在终端运行以下命令即可完成配置并启动编译过程: ```bash catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ``` 此操作会告知 CMake 导出编译命令到指定的工作区中的 `build` 子目录下[^4]。 #### 查找生成的文件位置 成功执行以上命令之后,`compile_commands.json` 将被放置于当前 Catkin 工作空间内的 `build` 目录里。如果默认工作路径未更改,则通常位于如下地址: ``` <your_catkin_workspace>/build/compile_commands.json ``` 需要注意的是,虽然 `catkin_make` 是一种简化版封装工具,但它可能无法完全满足现代开发需求(比如多线程支持不足等问题)。因此对于更加复杂的场景或者更高效率的需求而言,推荐考虑采用其后续版本如 `catkin build` 来替代它[^3]。 #### 示例脚本自动化处理 下面给出一段简单的 Bash 脚本来帮助自动创建一个新的临时工作区以及应用所需设置: ```bash #!/bin/bash # 创建新的工作区域结构 mkdir -p /tmp/new_example_ws/src && cd /tmp/new_example_ws/ # 执行带特定标志的 catkin_make 构建流程 catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=ON echo "Compile commands file should now exist at $(pwd)/build/compile_commands.json" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值