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编写脚本比较痛苦,比如想一眼看出相 ...
随机推荐
- 微信小程序——获取formid
小程序对模板消息推送做了相应的限制:如果用户主动触发小程序表单提交1次,小程序可在7天内向用户主动推送1条模版消息,如果用户通过小程序完成支付,小程序可在7天内向用户主动推送3条模版消息.(formi ...
- MyBatis 示例-类型处理器
MyBatis 提供了很多默认类型处理器,参考官网地址:链接,除了官网提供的类型处理器,我们也可以自定义类型处理器. 具体做法为:实现 org.apache.ibatis.type.TypeHandl ...
- redis之PubSub
前面我们讲了 Redis 消息队列的使用方法,但是没有提到 Redis 消息队列的不足之处,那就是它不支持消息的多播机制. 消息多播 消息多播允许生产者生产一次消息,中间件负责将消息复制到多个消息队列 ...
- django-ForeignKey,OneToOneField,ManyToManyField
进入到django自带的related.py中,可以看到 1.ForeignKey 初始化的参数有: to, on_delete, related_name=None, related_query_n ...
- JavaScript随机生成布尔值
//方法一 var rand = Boolean(Math.round(Math.random())); conosole.log(rand) // 方法二: var arr = [true,fals ...
- 这一次,终于系统的学习了 JVM 内存结构
最近在看< JAVA并发编程实践 >这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课 ...
- MUI 混合开发移动app应用开发 --- app版本升级
当我们的app开发完成之后,无可避免的以后会进行产品升级,那么我们希望在客户的手机上让app进行自动升级,可以分为自动升级和手动升级. 自动升级:一般在客户app第一次打开首页的时候. 手动升级:在a ...
- php curl 生成的cookie 文件含义 cookie 属性含义
最近用了curl 感觉还是很方便的,看了下curl生成的 cookie 文件 格式 , 对其中一些值的含义不是很明白,去找了些cookie的资料看了下,做下备忘 PHP curl 生成 的 cooki ...
- 记录一次C#的asyn和await
static void Main(string[] args) { var d = new NavDownLoader(); Task<bool> success = d.DownLoad ...
- Flex简记
display的flex属性的使用对象分为1.容器即包含有元素的元素,2.项目,即某一个元素.就容器而言,flex可以实现换行(flex-wrap),改变容器内元素的排列方向(flex-directi ...