iOS 调试技巧

摘要:
LLDB调试LLDB支持源文件名、符号名、文件名等的命令完成。终端窗口中的完成通过在命令行中输入选项卡来初始化。watchpoint监视内存块、图像寻址等(功能强大)表达式执行表达式调用执行调用1.NSAssert()宏的使用:Assert NSAssertassertNS_block_ASSERTIONNSassert只能在Objective-c中使用。它是断言的扩展。它可以捕获断言类异常并打印一些可读日志。是否有更好的方法来完成@importUIKit?如果你想到了,你可以联系我~

1。如果还没有日志,在Console中输入po$eax$eax标志出错的地方,适用模拟器,真机用$r0(话说EXC_BAD_ACCESS这种错误模拟器定位就行),还可以输入比如:po[$eaxname]po[$eaxreason]等指令查看错误其他信息(注意方括号后没分号的)。然后,就没有然后了。
2. 一种就是signal SIGABRT,大概的意思就是发送Message出现问题,信号迷失了。

LLDB调试

LLDB支持源文件名,符号名,文件名,等等的命令补全(Commmand Completion)。终端窗口中的补全是通过在命令行中输入一个制表符来初始化的。Xcode控制台中的补全与在源码编辑器中的补全方式是一样的:补全会在第三个字符被键入时自动弹出,或者通过Esc键手动弹出。

watchpoint  监视一个内存块
image    寻址等(强大)
expression    执行一个表达式
call     执行一个调用(界面调试)

1. NSAssert()宏的使用:

断言 NSAssert assert NS_BLOCK_ASSERTIONS

NSAssert 只能在Objective-c里面使用。是assert的一个扩充。能捕获assert类异常及打印一些

可读的日志。而assert只是让app crash(abort).

xcode 中 大家都会在debug(QA) 模式下进行调试代码

所以我们只需要再build Settings 中假如宏定义 变成够 控制 NSAssert的生效范围

例如 只希望debug(QA) 下启动 release(Prod) 不启用,

则添加 NS_BLOCK_ASSERTIONS

使用:#define QLAllert(condition, fmt, ...) NSAssert(condition, (@"---- assert log ---- FilePath : %s function : %s lineNum : %d" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)

2. malloc_info命令查看内存:

(1)xcode -> Edit scheme -> Diagnostics -> Logging 选中 Malloc stack

(2)在控制台执行command script import lldb.macosx.heap  (如果不行,就去掉command试一下,原因还不明确)

(3)执行malloc_info --stack-history 0x10010d680 或者 malloc_info -S0x10010d680 (对象地址) 结果是:得到这个对象分配之前的内存分配顺序

3. .lldbinit文件

LLDB有了一个启动时加载的文件~/.lldbinit,每次启动都会加载。所以一些初始化的事儿,我们可以写入~/.lldbinit中,比如给命令定义别名等。但是由于这时候程序还没有真正运行,也有部分操作无法在里面玩,比如设置断点。

(1) .lldbinit是一个系统的隐藏文件,开始是不存在的,需要我们创建,但是.开头的文件名是系统预留的,不能创建这样的文件,所以我们可以使用命令行命令touch ~/.lldb创建

(2) 创建完成后我们可以使用vi命令编辑这个文件写入我们想要的初始化操作

(3) display @import UIKit       target stop-hook add -o "target stop-hook disable"

  • 命令1:使用display表示在stop的时候执行@import UIKit
  • 命令2:由于我们只需要执行一次@import UIKit,所以执行完成之后,执行target stop-hook disable,使原有的所有stop-hook失效

这个命令有个缺陷,直接点击Xcode上的pausedebug view hierarchystop-hook不会生效。正在探索有没有更好的办法完成@import UIKit,如果你想到了,可以联系我~

免责声明:文章转载自《iOS 调试技巧》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关联查询报错org.apache.ibatis.builder.BuilderException: Ambiguous collection type for property 'episodeList'. You must specify 'javaType' or 'resultMap'.在Visual Studio中调试XSLT下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

webstorm像idea调试java一样调试npm的js项目

一.相关软件安装和配置   安装WebStorm   WebStorm官网:( https://www.jetbrains.com/webstorm/ )   安装Chrome和JetBrains IDE Support   JetBrains IDE Support的地址是:        https://chrome.google.com/websto...

GDB高级使用方法

1、设置环境变量   用户可以在GDB的调试环境中定义自己需要的变量,用来保存一些调试程序中的运行数据。要定义一个GDB的变量很简单,只需使用GDB的set命令。   GDB的环境变量和Linux一样,也是以$起头。如:   (gdb)set $foo=xxx   使用环境变量时,GDB会在第一次使用时创建这个变量,而在以后的使用中,则直接对其赋值。...

gdb调试

前期准备 一般来说GDB主要调试的是C/C++的程序。在gdb调试之前,必须要把调试信息加到可执行文件中。使用编译 器(cc/gcc/g++)的 -g 参数可以做到这一点。如: gcc -g hello.c -o hello g++ -g hello.cpp -o hello 如果没有-g,将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。...

[转]iOS高级调试&逆向技术-汇编寄存器调用

前言 本文翻译自Assembly Register Calling Convention Tutorial 序言 通过本教程,你会可以看到CPU使用的寄存器,并探索和修改传递给函数调用的参数。还将学习常见的苹果计算机架构以及如何在函数中使用寄存器。这就是所谓架构的调用约定。 了解汇编是如何工作的,以及特定架构调用约定是如何工作是一项极其重要的技能。它可以...

如何调试程序的 Release 版本

很多时候程序的 Debug 版本运行没有任何问题,但是一旦发布 Release 版本后,运行就出错,着实让人郁闷。大家知道,VC++ 中 Release 版本是对无法对源代码进行调试的。一般的做法是在怀疑有错误的代码前后插入MessageBox 函数,在函数中显示可能导致错误的变量的值。或者插入写文件的语句,输出可能导致错误的变量的值到一个记录文件。其实,...

异常(1)

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 异常(1) 1. 异常种类2. CPU异常的产生3. 用户模拟异常4.CPU异常与用户模拟异常的总结5. 内核层异常的分发与处理6. 用户层的异常处理7.VEH异常8.SEH异常 《SEH异常拓展》9.当用户层异常未处理时...