LLDB 在打印 double 类型的结构字段时存在各种问题,如下所述: 奇怪的行为-in-lldb-when-printing-a-double-type-struct-member。
在我自己的情况下,我尝试打印 CLLocationCoordinate2D 类型的结构。从 Xcode 4.5.2 开始,打印 CLLocationCoordinate2D 的错误仍然存在。
寻找解决此错误的方法,我在此博客中遇到了一个不错的宏 LOG_EXPR:http: //vgable.com/blog/2010/08/19/the-most-useful-objective-c-code-ive-ever -书面/
它在将类型记录到调试器方面做得很好,但不能从调试器中调用。
有没有人想出一种方法来在 LLDB 命令行界面中调试时执行 LOG_EXPR 之类的操作,或者任何其他改进的打印可以从命令行处理任意结构,而不是切换回 GDB?
这是我输入 LLDB 时发生的情况:
(lldb) p (CLLocationCoordinate2D)[self mapSetPointLatLon]
(CLLocationCoordinate2D) $4 = {
(CLLocationDegrees) latitude = 42.4604
(CLLocationDegrees) longitude = 42.4604
(double) easting = 42.4604
(double) northing = -71.5179
}
注意 lldb 添加的多余和错误的行。
当我将 LOG_EXPR 编译到我的代码中时,会发生以下情况(在同一断点处):
Line of Code (not debugger):
LOG_EXPR(self.mapSetPointLatLon);
produces the correct output in the debugger output:
2013-01-26 14:02:17.555 S6E11[79116:c07] self.mapSetPointLatLon = {latitude=42.4604,longitude=-71.5179}
如果我尝试从命令行调用 LOG_EXPR 在同一断点处,会发生以下情况:
(lldb) expr LOG_EXPR(self.mapSetPointLatLon);
error: use of undeclared identifier 'LOG_EXPR'
error: 1 errors parsing expression
(lldb)
这是另一个示例,因为事实证明,您可以让调试器做正确的事情。
这是我的代码片段,我在其中分配了 2 种方式的结构:
CLLocationCoordinate2D defloc = CLLocationCoordinate2DMake(kStartingLat, kStartingLon);
[[self.verticalPagingViewController mapPagingViewController] setMapSetPointLatLon: defloc];
如果我只是打印它的工作变量。
(lldb) p defloc
(CLLocationCoordinate2D) $1 = {
(CLLocationDegrees) latitude = 42.4604
(CLLocationDegrees) longitude = -71.5179
}
如果我正在转换访问器方法的返回值的类型,它会失败。
(lldb) p (CLLocationCoordinate2D)[[self.verticalPagingViewController mapPagingViewController] mapSetPointLatLon]
(CLLocationCoordinate2D) $2 = {
(CLLocationDegrees) latitude = 0
(CLLocationDegrees) longitude = 0
(double) easting = 0
(double) northing = 0
}