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脚本问题总结的更多相关文章

  1. 使用Python脚本强化LLDB调试器

    LLDB是Xcode自带的调试器,作为一个iOS应用开发程序员,平时我在开发应用时会使用LLDB来调试代码.在逆向应用时,也会用到LLDB来跟踪应用的执行过程. LLDB还内置了一个Python解析器 ...

  2. iOS LLDB调试器

    随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器.它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.LLDB为Xcode提供了底层调试环 ...

  3. iOS 开发者旅途中的指南针 - LLDB 调试技术

    文章转载于:iOS 开发者旅途中的指南针 - LLDB 调试技术 今天给大家介绍的内容,无关乎任何功能性开发技术,但又对开发的效率影响至深,这就是调试技术. 何为调试呢,比如我们用 print 函数在 ...

  4. Xcode - LLDB调试技巧

    LLDB是Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.平时用Xcode运行程序,实际走的都是LLDB.熟练使用LLDB,可以让你debug事半功倍. ...

  5. 在lldb调试中调用c++函数

    在lldb调试时,调用oc对象的方法不足为奇,因为msgSend是有原型导出的,oc对象的方法都运行期绑定的,绑定信息都在objc_class中.只要在调试中[receiver sel]之类,lldb ...

  6. visual studio code 里调试运行 Python代码

    最近对微软的visual studio code 挺感兴趣的,微软的跨平台开发工具.轻量简洁. 版本迭代的也挺快的,截止16年8月2日已经1.3.1版本了,功能也愈加完善.(16年12月18日 已经, ...

  7. 如何在命令行里运行python脚本

    python是一款应用非常广泛的脚本程序语言,谷歌公司的网页就是用python编写.python在生物信息.统计.网页制作.计算等多个领域都体现出了强大的功能.python和其他脚本语言如java.R ...

  8. ArcGIS使用Python脚本工具

    在Pyhton写的一些代码,用户交互不方便,用户体验比较差,不方便重用.在ArcGIS中可以将用写的Python代码导入到ToolBox中,这样用起来就比较方便了.这里用按要素裁剪栅格的Python来 ...

  9. 如何解决Python脚本在Linux和Windows上的格式问题

    python是一种对缩进有严格要求的语言, Python脚本可以使用非常多的工具进行编写,笔者在Linux系统使用JEdit进行Python脚本编写,由于在Linux编写脚本比较痛苦,比如想一眼看出相 ...

随机推荐

  1. beanfactory中单例bean的初始化过程(一)

    Date 10.06 pm Point 完成beanfactory中单例bean的初始化 beanFactory.preInstantiateSingletons() 拿到所有的bean定义信息(在 ...

  2. 仿写vue UI 组件总结 (自己练习,仿照现有的UI组件)

    UI组件 Vue开发插件流程 本来是昨天要写总结的,感觉自己写不好,就放弃了.今天看到了iview和element有一些摩擦,是关于代码借鉴的问题(哈哈),不做评价.谁下生会写组件,我仿(chao)写 ...

  3. Java HashMap底层实现原理源码分析Jdk8

    在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里.但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依 ...

  4. SpringBoot1.x与监控(六)

    由于2.x和1.x的监控不一样,此处先讲1.x 一 SpringBoot1.x监控 pom.xml <dependency> <groupId>org.springframew ...

  5. Stringbuilder常用方法

    一.创建Stringbuilder对象StringBuilder strB = new StringBuilder(); 1.append(String str)/append(Char c):字符串 ...

  6. Method Not Allowed (GET): /boxuegos/index/ 错误

    1,Method Not Allowed (GET) 请求方法不被允许, 错误原因:我调用的是index这个方法,但是我上面定义了一个空的子路由,所以页面加载不了,控制台出现Method Not Al ...

  7. (Java) byte[] 和 base64 字符串之间的转换

    import org.apache.commons.codec.binary.Base64; public class UtilHelper { //base64字符串转byte[] public s ...

  8. pytest -- 中文文档

    pytest-chinese-doc pytest官方文档(5.1.3版本)的中文翻译,但不仅仅是简单的翻译: 更多的例子,尽量做到每一知识点都有例子: 更多的拓展阅读,部分章节添加了作者学习时,所查 ...

  9. WPF项目设计规则

    关于WPF应用程序的设计: 项目构成,自上而下: 1. 前端的WPF应用程序项目. 2. 业务逻辑的类库项目. 3. 映射到数据库各个表的Model型类库,(数据库操作接口定义). 4. 其他工具型类 ...

  10. [2018-06-28] django项目 实例

    实例一.显示一个基本的字符串在网页中 首先先进入views.py def home(request): string = u'随便写' return render(request, 'home.htm ...