我可以通过Xcode调试区域中的"Watch'变量'来观察一个变量,它可以正常工作,因为Xcode会在观察变量变化时中断.但是,由于我没有看到"观察窗口",我怎么能删除观察到的变量?或者看到我正在看的变量?通过LLDB命令?
我有一些@properties在调试器中表现得很奇怪@synthesize,然后继承控制器.
当我删除@synthesize时,@ property会按预期运行.
这是一个基本的例子,一个ViewController叫做的子类SubClassedViewController.
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
NSNumber *someNumber;
}
@property (nonatomic, strong) NSNumber *someNumber;
@end
Run Code Online (Sandbox Code Playgroud)
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize someNumber; //Strange behavior unless I remove this line
- (void)viewDidLoad
{
[super viewDidLoad];
someNumber = [NSNumber numberWithInt:123];
// Do any additional setup after loading the view, typically from a nib.
}
@end
Run Code Online (Sandbox Code Playgroud)
#import "ViewController.h"
@interface SubClassedViewController : ViewController
@end
Run Code Online (Sandbox Code Playgroud)
#import "SubClassedViewController.h" …Run Code Online (Sandbox Code Playgroud) 我在/ usr/local/bin中构建了lldb树的顶部,我想告诉xcode使用这个二进制文件而不是默认的二进制文件.但我找不到如何/在哪里设置这个.
我正在研究为什么Bonjour服务发现中的TXT记录的内容有时被不完整地解释,并且我已经达到了这样一个点,即断点打印出unsigned char的内容真的很有用.在回调中(我已经尝试过NSLog,但在线程回调中使用NSLog会变得非常棘手).
回调函数以这种方式定义:
static void resolveCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode,
const char* fullname, const char* hosttarget, uint16_t port, uint16_t txtLen,
const unsigned char* txtRecord, void* context) {
Run Code Online (Sandbox Code Playgroud)
所以我对txtRecord感兴趣
现在我的断点正在使用:
memory read --size 4 --format x --count 4 `txtRecord`
Run Code Online (Sandbox Code Playgroud)
但这仅仅是因为这是lldv.llvm.org示例页面上的一个示例;-)它肯定会显示我期望在那里部分的数据.
我是否必须应用有关长度的知情知识,或者可以对断点进行编码,使其使用存在的长度?我在想,除了"硬编码"示例中的两个4之外,还应该有一种方法可以将其他读取指令包含在后面的内容中,就像我使用变量名一样.
看看http://lldb.llvm.org/varFormats.html我以为我会尝试使用C格式而不是x但是会打印出一系列的点,这些点必须意味着我选择了错误的格式或其他内容.
我刚试过
memory read `txtRecord`
Run Code Online (Sandbox Code Playgroud)
这几乎正是我想看到的,因为它给出了:
0x1c5dd884: 10 65 6e 30 3d 31 39 32 2e 31 36 38 2e 31 2e 33 .en0=192.168.1.3
0x1c5dd894: 36 0a 70 6f 72 74 3d 35 …Run Code Online (Sandbox Code Playgroud) 简单的问题,但我似乎无法在网上找到答案,这真的令人沮丧.
假设我有这个错误的代码我正在尝试调试:
int myBug()
{
while(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我用LLDB调试这个并且类型print myBug()我得不到结果,那么(没有惊喜).然而,这意味着我无法再调试,因为LLDB被卡住而不能continue.有没有办法杀死print myBug()命令?到目前为止,唯一的解决方法是退出并重新启动所有内容 - 远非方便.
我在Xcode 4.6.1中使用LLDB,我尝试了一些按键,如Ctrl + C,Ctrl + T,但似乎没有任何工作:(
OS X有一个名为MobileDevice的无证(私有)框架.它用于从iOS设备获取数据.我正在编写使用它的应用程序,我希望能够在iOS设备的电池上提取充电次数.在MobileDevice中执行此操作的函数称为AMDeviceCopyValue().它需要3个参数:设备的地址(只是一个整数),您要复制的值的域(C字符串),以及您要复制的值的键(另一个C字符串. )
由于没有记录此框架,因此很难找到需要使用的字符串.其中一些已在网上发布,但不是计算充电周期的一个.我在网上发现的另一个程序已经这样做了,iCopyBot:http://www.icopybot.com/blog/check-ipad-iphone-battery-charge-cycle-count-without-jailbreaking.htm
我想在LLDB中启动iCopyBot,然后让LLDB打印出每次调用时iCopyBot传递给AMDeviceCopyValue()的域和关键参数.框架对时间敏感,所以我不能让它停止执行中 - 它只需要打印传递的参数并继续运行.
任何人都可以告诉我我必须做什么吗?我已经设法在LLDB中启动iCopyBot并且每次调用该函数时都设置了一个断点,但命令"frame variable"不会为我打印任何内容(我从Apple网站上获取的LLDB文档)建议它应该打印传入的参数......它对我不起作用.)
我是XCode和Objective C的新手.我故意错误地为NSString*分配编号.
NSString* s = @1;
[s uppercaseString];
Run Code Online (Sandbox Code Playgroud)
虽然XCode给了我警告,但这段代码会编译.但在运行时我得到例外.现在我在日志中看到了(对不起图像,由于格式化,我无法正确粘贴文本)

在此日志中,我如何找到确切的错误位置.这个日志如何告诉我要更改哪些代码.
根据LLDB主页,LLDB可以在python脚本中导入,如下所示:
import lldb
Run Code Online (Sandbox Code Playgroud)
从发布包安装LLDB后(在Lubuntu 15.04上:sudo apt-get install lldb),我收到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/lldb/__init__.py", line 52, in <module>
_lldb = swig_import_helper()
File "/usr/lib/python2.7/dist-packages/lldb/__init__.py", line 44, in swig_import_helper
ImportError: No module named _lldb
Run Code Online (Sandbox Code Playgroud)
这是预料之中的!LLDB页面说:
LLDB具有Python脚本功能,并提供自己的名为lldb的Python模块.如果脚本在命令行lldb应用程序内运行,则Python模块将自动可用.但是,如果脚本要由命令行应用程序外部的Python解释器运行,则可以使用PYTHONPATH环境变量让Python解释器找到lldb模块.
通过使用-P标志调用命令行lldb工具可以获得正确的路径:
Run Code Online (Sandbox Code Playgroud)> export PYTHONPATH=`$llvm/build/Debug+Asserts/bin/lldb -P`如果您使用了不同的构建目录或进行了发布构建,则可能需要调整上述内容以满足您的需求.
所以那些有信心建立LLDB的人自己得到一个明确的指示,而那些只想使用已发布的软件包的新手会留下一个模糊的解释......
对于从发布包中安装所有内容的最基本情况,是否有人想出了"根据您的需求调整上述内容"的确切含义?lldb -P报告的路径无法解决问题:
user@user-VirtualBox:~$ lldb -P
/usr/lib/x86_64-linux-gnu/python2.7/site-packages
user@user-VirtualBox:~$ ls /usr/lib/x86_64-linux-gnu/python2.7/site-packages
ls: cannot access /usr/lib/x86_64-linux-gnu/python2.7/site-packages: No such file or directory
Run Code Online (Sandbox Code Playgroud) 我正在使用LLDB和最新的OS X工具链(lldb --version说lldb-340.4.110).
我试图调试可执行文件,它产生大量输出到stdout.以前可以通过重定向来抑制输出,例如/dev/null.
但在最新的OS X工具链更新后,它已开始产生以下错误:
(lldb) run >/dev/null
error: invalid JSON
Run Code Online (Sandbox Code Playgroud)
LLDB在该地区有变化吗?就像添加一些语法来指定stdin/stdout/stderr重定向一样.在LLDB文档或邮件列表中找不到任何线索.我也可以认为它是Apple特有的LLDB错误.
PS
我知道我的问题可以通过以下方式暂时解决:
sudo lldb -w -n <executable>在单独的终端窗口中,它将告诉LLDB等待具有给定名称的新进程,然后附加到该进程.在这种情况下,我可以在另一个stdin重定向到的终端窗口中运行我的可执行文件/dev/null.
但是我对这个工作流感到非常不舒服,因为stdout重定向只能在我的Linux机器上的GDB中运行.打破习惯总是让人不舒服.
lldb ×10
xcode ×5
debugging ×2
ios ×2
macos ×2
objective-c ×2
breakpoints ×1
c ×1
cocoa ×1
function ×1
linux ×1
python ×1
python-2.7 ×1
watch ×1
xcode4.5 ×1