使用LLDB调试C程序段错误时遇EXC_BAD_ACCESS问题求助
解决LLDB调试C程序时EXC_BAD_ACCESS(空指针)问题
你遇到的EXC_BAD_ACCESS (code=1, address=0x0)是典型的空指针访问错误,具体是_platform_strlen函数尝试读取地址0x0(空指针)导致的——说明你的程序在调用strlen(或依赖它的函数,比如printf("%s", ...)、strcpy等)时传入了NULL参数。
以下是具体的调试和解决步骤:
1. 查看完整调用栈定位出错代码
在LLDB中执行命令获取调用栈回溯:
(lldb) bt
输出会显示从崩溃点到你的代码的所有函数调用帧,找到属于你自己代码的帧(通常编号更高的帧),就能定位到触发错误的具体代码行。
2. 编译时必须开启调试信息
确保编译C程序时添加-g参数,否则LLDB只能显示系统库的汇编代码,无法定位到你的代码:
gcc -g your_program.c -o compiled
3. 检查字符串处理函数的参数
如果调用栈指向你代码中调用了字符串处理函数,立刻检查传入的指针是否为NULL:
- 比如
printf("%s", ptr);中ptr未初始化、指向已释放内存,或被错误赋值为NULL - 调用返回字符串的函数(如
malloc、自定义字符串生成函数)时,未判断返回值是否为NULL就直接使用
4. 用LLDB命令验证变量状态
定位到可疑代码后,用以下命令查看变量:
- 打印变量值:
(lldb) print ptr(替换ptr为你要检查的变量名) - 逐行执行代码:
(lldb) n(下一步,不进入函数) - 步入函数执行:
(lldb) s(进入调用的函数内部)
如果print ptr输出(char *) $0 = 0x0000000000000000,说明该指针为空,需要回溯它的初始化或赋值逻辑,确保指向有效的字符串内存。
5. 常见问题排查方向
- 函数返回值未校验:比如
malloc失败返回NULL,直接拿来使用 - 数组越界写入:越界操作覆盖了指针变量的内存,导致其变为
NULL - 内存重复使用:
free(ptr)后未将ptr置空,后续误操作该指针
内容的提问来源于stack exchange,提问作者charlietlamb
相关产品推荐
相关产品推荐

