lldb调试使用python脚本问题总结
lldb调试器可以使用python脚本实现功能增强,但也不是可以随心所欲的,在实际中有很多地方需要注意。
首先是对多线程环境调试使用python脚本,也要考虑python脚本有多线程安全,尤其是有许多任务繁重的工作线程,目标函数许多线程同时在使用时,脚本用到的全局变量就成了临界资源。如果只是通常地是使用python实现增强调试指令,手工指令显示结果,调试器运行在交互状态,就不会想到使用python脚本也会多线程运行。但是在做断点catch调试时,脚本自动在各catch点触发的线程上运行,没错python脚本运行在多线程环境了。python脚本用锁后,就要注意一个问题,锁住的代码块要考虑脚本异常后,因为锁没有释放使其它线程在catch点上饿死,影响了程序的运行,当然设计的调试自然就失败(不工作,达不到目的)了。
第二,也是与catch调试情况相关的,就是要注意调试时调用了程序的函数与catch点之间是否存在依赖关系。如果存在依赖关系,catch点触发的函数调用又使用了catch点的代码,结果就是catch点递归触发,或者说这里链环。通常调试器会在这种情况输出警告提示,"warning:hit point ..., skip the command...",就是调试器尝试跳过catch点定下的操作,但是并不是总能有效。最后结果只有一个,主线程被异常事件唤醒停在mach_msg_trap,也就是程序挂了。lldb比gdb在p指令多了一个打印对象的功能,这个功能并非由调试器实现的,而是调用了oc对象的description函数,和NSLog打印oc对象一样,调用了被打印的oc对象的函数。如果想在catch点,通过以上两种方法获取oc对象的打印信息,这就要考虑以上两种方法所依赖的函数或机制流程了。举例,在_pthread*的函数集合,catch触发操作打印一个oc字符串(po @"abc" 或 p (void)NSLog(@"abc")),调试继续,悲剧随即发生,程序挂了。因为触发的catch操作依赖了_pthread*的函数。跟着了catch触发操作引起的流程循环,如果你想在CFRunLoop里面的各步骤中,使用以上两种打印对象信息的方法,就要当心会不会引起了某个CFRunLoop的事件,又使得CFRunLoop因此又运行在你的catch点上。我尝试在RunLoop的observer点的回调函数catch打印info的信息,结果程序运行就挂了。没错,你发现了,本篇写的就是我踩过的坑。
第三,就是不要在python脚本中,通过HandleCommand执行调试器指令来读取寄存器,不要指望能正确读出中断现场的寄存器的值。因为python脚本运行在lldb之上,现在又由python调用lldb的命令(或指令),所以在这样的情景下,lldb读寄存器命令与程序中断(或断点)现场就相隔着一层python,lldb调试命令很自然就不是在读取程序断点的现场。因此在python脚本就必须使用lldb.frame.register来读取读取程序断点的现场,因为这是python的lldb模块对lldb调试器保存的寄存器现场进行了keep one copy。
lldb调试使用python脚本问题总结的更多相关文章
- 使用Python脚本强化LLDB调试器
LLDB是Xcode自带的调试器,作为一个iOS应用开发程序员,平时我在开发应用时会使用LLDB来调试代码.在逆向应用时,也会用到LLDB来跟踪应用的执行过程. LLDB还内置了一个Python解析器 ...
- iOS LLDB调试器
随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器.它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.LLDB为Xcode提供了底层调试环 ...
- iOS 开发者旅途中的指南针 - LLDB 调试技术
文章转载于:iOS 开发者旅途中的指南针 - LLDB 调试技术 今天给大家介绍的内容,无关乎任何功能性开发技术,但又对开发的效率影响至深,这就是调试技术. 何为调试呢,比如我们用 print 函数在 ...
- Xcode - LLDB调试技巧
LLDB是Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.平时用Xcode运行程序,实际走的都是LLDB.熟练使用LLDB,可以让你debug事半功倍. ...
- 在lldb调试中调用c++函数
在lldb调试时,调用oc对象的方法不足为奇,因为msgSend是有原型导出的,oc对象的方法都运行期绑定的,绑定信息都在objc_class中.只要在调试中[receiver sel]之类,lldb ...
- visual studio code 里调试运行 Python代码
最近对微软的visual studio code 挺感兴趣的,微软的跨平台开发工具.轻量简洁. 版本迭代的也挺快的,截止16年8月2日已经1.3.1版本了,功能也愈加完善.(16年12月18日 已经, ...
- 如何在命令行里运行python脚本
python是一款应用非常广泛的脚本程序语言,谷歌公司的网页就是用python编写.python在生物信息.统计.网页制作.计算等多个领域都体现出了强大的功能.python和其他脚本语言如java.R ...
- ArcGIS使用Python脚本工具
在Pyhton写的一些代码,用户交互不方便,用户体验比较差,不方便重用.在ArcGIS中可以将用写的Python代码导入到ToolBox中,这样用起来就比较方便了.这里用按要素裁剪栅格的Python来 ...
- 如何解决Python脚本在Linux和Windows上的格式问题
python是一种对缩进有严格要求的语言, Python脚本可以使用非常多的工具进行编写,笔者在Linux系统使用JEdit进行Python脚本编写,由于在Linux编写脚本比较痛苦,比如想一眼看出相 ...
随机推荐
- 一篇文章彻底搞懂snowflake算法及百度美团的最佳实践
写在前面的话 一提到分布式ID自动生成方案,大家肯定都非常熟悉,并且立即能说出自家拿手的几种方案,确实,ID作为系统数据的重要标识,重要性不言而喻,而各种方案也是历经多代优化,请允许我用这个视角对分布 ...
- L2-007. 家庭房产(并查集)
#include <cstdio> #include <set> #include <vector> #include <algorithm> usin ...
- linux下执行脚本失败的解决办法
现象: 1的解决办法:赋予该文件可执行权限即可,chmod +x docker.sh 2的解决办法:https://blog.csdn.net/youzhouliu/article/details/7 ...
- 了解这一行的,腰包都鼓鼓的了,程序辅导,CS作业
我们都知道计算机这类理科专业,可能你打开电脑聊几分钟微信,可能你就已经错过了成为程序员大佬的机会.就像数学专业的同学弯腰捡了一支笔,然后发现黑板被写满从此再也没有学懂数学.所以课后的作业自然也就没法顺 ...
- C语言 二叉树的遍历(递归和非递归)
#include <iostream> #include <cstdio> #include "biTree.h" #include "cstdl ...
- 误删除 mySQL 用户解决办法
误删除用户解决办法 删除用户 删除用户 mysql> truncate mysql.user;Query OK, 0 rows affected (0.05 sec)mysql> sel ...
- 数据结构(三十二)图的遍历(DFS、BFS)
图的遍历和树的遍历类似.图的遍历是指从图中的某个顶点出发,对图中的所有顶点访问且仅访问一次的过程.通常有两种遍历次序方案:深度优先遍历和广度优先遍历. 一.深度优先遍历 深度优先遍历(Depth_Fi ...
- 在VMware下的Linux中的RAID10校验位算法下的磁盘管理
988年由加利福尼亚大学伯克利分校发表的文章首次提到并定义了RAID,当今CPU性能每年可提升30%-50%但硬盘仅提升7%,渐渐的已经成为计算机整体性能的瓶颈,并且为了避免硬盘的突然损坏导致数据丢失 ...
- [无用]LNC李纳川的日常NC操作
NC说他从不CE NC说他想明白了 表示嘲讽. 好吧好吧其实还是有一个美好的结局的. 虽说我在嘲讽他,但我并不会做TAT 大神吹牛没毛病,我个蒟蒻还是老老实实刷水题吧.
- 使用Typescript重构axios(六)——实现基础功能:获取响应数据
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...