171 – LLDB实用 – expression

10. 四月 2019 iOS 0

查看帮助在LLDB Debugger,在这个页面你可以找到所有我下面和以后要说的东西.

今天,我要说的是LLDB调试中最常用的表达式expression,为什么说它是最常用的,因为po objectp object都是有关于它的缩写,我们经常需要在lldb的命令行中打印对象,调用方法,都和expression相关。

了解expression

我们在了解如何使用lldb时,肯定借助最多的就是help关键字。 help expression可以帮助我们很好的了解expression的相关内容。

Evaluate an expression on the current thread.Displays any returned value with LLDB’s default formatting. Expects ‘raw’ input (see ‘help raw-input’.)

根据上文的意思,expression的作用有:

感觉表达的不是很清晰,让我们直接看看怎么用吧。

expression表达式

使用前,我们介绍一下expression的基本表达式:

<cmd-options>有下面这些:

我们一般来说用不到这么多的指令,所以请看下面,平常的几个实用场景

使用场景

1.临时更换变量值(if判断时的设置)-> 可以进一步配合breakpoint+command,运行时更换值

在这个例子中,我会临时生成一串字符串,然后我会根据生成的字符串长度来进行一个条件判断处理,一般来说是正常的,但是我想测试一下异常情况。使用expression,无需改动代码,就可以让流程走到异常处理中。如下图:

可以看到我们已经将uStr变量变为空,接下来执行就可以了。

如果我们想一直保持异常状态知道我们调试结束呢?

2.代码注入 (需要临时添加一行代码,或者需要跳过一行代码)

我们现在基本已经熟悉了expression在调试时的常用用法了。这种更改我们代码的方式就被称为代码注入。

有了临时书写代码的方式,那么我们要是可以跳过一行我们可能需要调整的代码,再加上代码的注入,是不是可以完整的验证修复的bug呢?
那么到底有没有这种操作?答案是肯定:thread jump --by 1这句话的执行,就可以在断点处跳过执行代码。如下图:

 

当然,这种具有一定破坏性的操作,有一些注意事项,你在手动移动线程指针时会受到Xcode的提示:

具体的使用方法也可以看看我的另外一篇文章《170 – thread jump使用注意》

3.UI调整

最后也是expression的比较酷炫的操作,在断点的情况下调整UI。我们的UI设计师,有很多都是像素眼,看见UI有偏移,就会坐我们旁边直到改满意为止。那么每次修改一遍UI都要重新跑么?明明有代码注入这么方便的操作,但是我修改了frame怎么没有用呢?

expression [CATransaction flush]
因为出了要注入我们需要更改的代码,还需要我们再注入上面一行代码,来处理界面的更新。

 

总结

expression不仅仅是一个打印对象的指令,同时,它也提供了一种我们在调试时可以进行代码注入的操作。总体来说,它可以配合其它lldb调试技巧一起使用的技术,通过与断点的配合,command指令的添加,让我们更快的修复好出现问题的代码。

这篇文章是开启一个LLDB高级调试的入口,希望继续学习下去,因为还有很多的lldb指令可以了解!