lldb

Xcode 调试技巧

我怕爱的太早我们不能终老 提交于 2020-03-02 12:39:33
   【前言】:本篇为同事崔桂祥分享资料。   随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器。它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。LLDB为Xcode提供了底层调试环境,其中包括内嵌在Xcode IDE中的位于调试区域的控制面板,在这里我们可以直接调用LLDB命令,示例如下: 1.必备篇 1.1 打印变量: print/po print :打印变量的值可以使用 print命令,该命令如果打印的是简单类型,则会列出简单类型的类型和值。如果是对象,还会打印出对象指针地址; print object :如果我们只想查看对象的值的信息,则可以使用 po (print object的缩写 )命令。 1.2 查看线程状态: thread list   在进程停止后,LLDB会选择一个当前线程和线程中当前帧(frame)。很多检测状态的命令可以用于这个线程或帧。   为了检测进程的当前状态,使用该命令,其中星号(*)表示thread #1为当前线程。 1.3 获取线程的跟踪栈: thread backtrace (简写bt)   使用命令 thread backtrace (简写bt)可以查看线程的跟踪栈,若要查看所有线程的调用栈则可以使用命令: thread backtrace all (简写bt all) 。

Xcode 调试技巧

强颜欢笑 提交于 2020-03-02 12:38:17
随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器。它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。LLDB为Xcode提供了底层调试环境,其中包括内嵌在Xcode IDE中的位于调试区域的控制面板,在这里我们可以直接调用LLDB命令 目录 一、 必备篇 • 打印变量 • 查看线程状态 • 获取线程的跟踪栈 • 列出帧参数和本地变量 • 寻址 • 帮助系统 二、 技巧篇 • 运行时修改变量的值 • 异常排查 • 符号断点 • Watchpoints 一、必备篇 1.1 打印变量 print :打印变量的值可以使用 print命令,该命令如果打印的是简单类型,则会列出简单类型的类型和值。如果是对象,还会打印出对象指针地址 print object :如果我们只想查看对象的值的信息,则可以使用 po(print object的缩写 )命令 1.2 查看线程状态 thread list 在进程停止后, LLDB会选择一个当前线程和线程中当前帧 (frame)。很多检测状态的命令可以用于这个线程或帧。 为了检测进程的当前状态,使用该命令,星号 (*)表示 thread #1为当前线程 1.3 获取线程的跟踪栈 使用命令 thread backtrace (简写bt),若要查看所有线程的调用栈则可以使用命令: thread

XCode调试器LLDB

老子叫甜甜 提交于 2020-03-02 12:30:19
与调试器共舞 - LLDB 的华尔兹 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函数调用来简化程序的行为? NSNumber *n = @7; // 实际应该调用这个函数:Foo(); 或者短路一个逻辑检查? if (1 || theBooleanAtStake) { ... } 或者伪造一个函数实现? int calculateTheTrickyValue { return 9; /* 先这么着 ... */ } 并且每次必须重新编译,从头开始? 构建软件是复杂的,并且 Bug 总会出现。一个常见的修复周期就是修改代码,编译,重新运行,并且祈祷出现最好的结果。 但是不一定要这么做。你可以使用调试器。而且即使你已经知道如何使用调试器检查变量,它可以做的还有很多。 这篇文章将试图挑战你对调试的认知,并详细地解释一些你可能还不了解的基本原理,然后展示一系列有趣的例子。现在就让我们开始与调试器共舞一曲华尔兹,看看最后能达到怎样的高度。 LLDB LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的 开源 调试器。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令

iOS调试 LLDB

瘦欲@ 提交于 2020-03-02 12:29:23
LLDB是个开源的内置于XCode的具有REPL(read-eval-print-loop)特征的Debugger,其可以安装C++或者Python插件。 常用调试命令: 1、print命令 print命令的简化方式有prin pri p,唯独pr不能用来作为检查,因为会和process混淆,幸运的是p被lldb实现为特指print。 实际上你会发现,lldb对于命令的简称,是头部匹配方式,只要不混淆,你可以随意简称某个命令。 例如: (lldb) p i (int) $3 = 0 返回的$3是命令结果的引用名,使用$3可以进行print $3 + 7这样打印出7,当然,$3可以被用于任何其他表达式或者接收参数的命令。 2、expression命令 expression命令可以用来修改变量的值,当然大部分情况下,使用xcode提供的可视化编辑器更方便。 (lldb) e i = 100 (int) $4 = 100 实际上print相当于expression --,而--的意思是命令的参数终止,跟在--后面的都是命令的输入数据 要打印一个对象,则需要使用e -O -- anObj,而e -O -- 的缩写正是我们常用的po命令: 3、流程控制命令 继续:process continue, continue, c 下一步:thread step-over, next, n 进入

如何使用lldb/gdb调试Nim程序

自闭症网瘾萝莉.ら 提交于 2020-02-29 21:57:49
一般用nim写程序基本都用echo, repr等命令简单调试, 相信大家也会需要高级调试的时候, 所以在这里介绍如何使用lldb或gdb调试nim程序. 首先输入代码保存test.nim. #test.nim echo "Hello World" var x = 10 echo "Value of x: ", x 然后打开终端. $nim c --debugger:native test.nim #用nim编译出带调试内容的程序 $lldb ./test #或者gdb ./test (lldb)b test.nim:2 (lldb)run #运行后会断到 x = 10 这行 (lldb)n #运行到下一行 echo ... (lldb)p x_95008 #查看x的值,为什么是x_95008等会再说 $0 = 10 (lldb)p x_95008 = 666 #改变x的值 $1 = 666 (lldb)c Value of x: 666 (lldb)q #y 退出调试器 代码里的变量明明是x为什么变成x_95008了呢? 而且这个数字我是怎么知道的? 这个疑问首先要了解nim的编译过程是怎样, nim编译文件首先会把nim代码转成c/c++/objc代码放到同目录的nimcache目录里, 然后再交给相关的编译器编译, 所以这个变量真实的名字就是在./nimcache/test

【LLDB】高级运用与深入理解

僤鯓⒐⒋嵵緔 提交于 2020-02-29 21:52:08
###LLDB获取帮助 调用help命令来列出LLDB所有的顶层命令 ###LLDB高级运用 (lldb) e int $a = 2 (lldb) p $a * 19 38 (lldb) e NSArray *$array = @[ @"Saturday", @"Sunday", @"Monday" ] (lldb) p [$array count] 3 (lldb) po [[$array objectAtIndex:0] uppercaseString] SATURDAY (lldb) p [[$array objectAtIndex:$a] characterAtIndex:0] error: no known method '-characterAtIndex:'; cast the message send to the method's return type error: 1 errors parsing expression //lldb无法判定某一步的计算结果是什么数据类型 (lldb) p (char)[[$array objectAtIndex:$a] characterAtIndex:0] 'M' (lldb) p/d (char)[[$array objectAtIndex:$a] characterAtIndex:0] 77 (lldb) thread

LLDB命令 以及相对应的GDB的命令

落爺英雄遲暮 提交于 2020-02-29 09:15:51
搞ios开发不学点debuger命令,有点说不过去。以下的表格罗列了LLDB命令 以及相对应的GDB的命令,并且列举了双方内置的兼容的命令别名。 执行类命令集 LLDB GDB Launch a process no arguments. (lldb) process launch (lldb) run (lldb) r (gdb) run (gdb) r Launch a process with arguments <args>. (lldb) process launch — <args> (lldb) r <args> (gdb) run <args> (gdb) r <args> Launch a process for with arguments a.out 1 2 3 without having to supply the args every time. % lldb — a.out 1 2 3 (lldb) run … (lldb) run … % gdb –args a.out 1 2 3 (gdb) run … (gdb) run … Launch a process with arguments in new terminal window (Mac OS X only). (lldb) process launch –tty — <args>

Qt使用教程之添加调试器

怎甘沉沦 提交于 2020-02-29 09:15:33
< Qt Enterprise最新版下载 > Qt Creator的调试器插件充当了Qt Creator内核和外部本地调试器之间一个接口,这些本地调试器指的是GNU Symbolic Debugger (GDB)、Microsoft Console Debugger (CDB)、QML/JavaScript调试器以及低级别的虚拟调试机(LLVM)项目的调试器、LLDB。在你的系统中,该调试器插件会为每个包自动选择合适的本地调试器。 若要添加调试器: 1. 选择Tools > Options > Build & Run > Debuggers > Add。 2. 在Name字段中,为调试器给定一个描述性的名称。 3. 在Path字段中,指定到调试器二进制文件的路径: 对于CDB(仅Windows),指定到Windows Console Debugger可执行文件的路径。 对于GDB,指定到GDB可执行文件的路径。该可执行文件必须使用Python脚本构建。 对于LLDB(实验),指定到LLDB可执行文件的路径。 Qt Creator将尝试识别调试器的类型和版本,并在Type和Version字段显示它们的类型和版本。 4. 在ABIs字段中,指定在嵌入式设备上使用的ABI版本。 有兴趣的朋友可以 点击查看更多有关Qt的文章 ! 来源: oschina 链接: https://my

iOS 开发之LLDB调试命令初探

此生再无相见时 提交于 2020-02-29 09:09:09
如果你在平时的开发中从未使用过调试器,那你恐怕不知道一个调试器的作用有多大。你可能只满足于通过 printf 或者 NSLog 输出信息用于调试。但你只要试着尝试在调试中开始使用调试器 LLDB ,你会马上感受到调试器给你带来的便利。 LLDB 是 LLVM 下的调试器。Xcode从4.0开始编译器开始改用 LLVM ,相应的调试器也从 gdb 改为 LLDB 。而从 Xcode5.0开始所有工程也被自动设置为使用 LLDB 。下面本文从初学者的角度讲解在日常的开发中如何使用 LLDB 以及 LLDB 常用的命令。 初识 LLDB 你可能从未使用过 LLDB ,那让我们先来热热身。 在调试器中最常用到的命令是 p (用于输出基本类型)或者 po (用于输出 Objective-C 对象)。如下,你可以通过输入po 和 view 来输出 view 的信息: po [self view] 随后调试器会输出这个 object 的 description。在这个例子中可能是这样的信息: (UIView *) $1 = 0x0824c800 <UITableView: 0x824c800; frame = (0 20; 768 1004); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray:

关于llvm后由lldb和gdb

不问归期 提交于 2020-02-29 08:42:44
只是知道 XCode4.0以后,编译器换成了 LLVM 编译器 2.0 肯定是因为 LLVM 更完美,因为人都是喜欢追求更完美的东西。不然也不会轻易更换,search了一篇才了解到: 与以前相比,更加强大: 1.LLVM 编译器是 下一带开源的编译技术 . 完全支持C, Objective-C, 和 C++. 2.LLVM 速度比 GCC快两倍 ,建立的程序也会运行的更快. 因为它更好的利用现代的芯片的结构. 3.LLVM 和Xcode 4完全的整合 在一起.包括关键字高亮,代码完整性等全都是由LLVM语法分析器来分析的. 这样可以在编辑的时候就可以很好的了解你的代码. 编译器进化之后,控制台调试命令前缀,也由原来的gdb更改成了lldb。当然以前的gdb命令如今还是可以完美的使用的。 关于调试的技巧和命令,其实我个人觉得在xcode里面用的很好。 用的比较多的命令就po 一个object,比较多的调试技巧就是添加一个exception断点。这个真的很好用,除了你的nib文件由野指针。一般都能准确定位你的异常在哪儿。 但是nib文件的也指针也是很好定位的。比如你nib文件中一个button指向的那个method找不到,lldb将给你 -[LoginViewController onClickLogin:]: unrecognized selector sent to