【发布时间】:2015-01-14 20:03:59
【问题描述】:
我一直在尝试读取 .trace 文件,该文件是我使用 custom 工具模板生成的(工具:Automator,Allocations,泄漏)使用Instruments。
我在这个stackoverflow answer 中找到了最好的帮助。基本上,author 创建了一个自定义 Objective-C 程序(Traced)来读取特定类型的 Apples .trace 文件(仪器:OpenGL ES 驱动程序)。他的回答是针对 XCode 4.6。
代码仍然适用于 XCode 6.1,但跟踪文件似乎略有变化。您必须在.trace 包中找到*.run.zip 文件并将其解压缩。在提取的文件夹中,您现在必须找到 *.run 文件。 .trace 包中有几个 *.run.zip 文件;每个使用过的乐器一个。
只需运行Traced 程序就会得到uncaught exception 'NSArchiverArchiveInconsistency', reason: '*** class error for 'XRObjectAllocRun'-error。
这个错误最初很容易发现。我所要做的就是实现缺失的类XRObjectAllocRun;与XRRun.m 中的示例XRRun 或XRVideoCardRun 类平行。
这是我走了多远以及卡住的地方:
#import "XRObjectAllocRun.h"
@implementation XRObjectAllocRun
- (id)initWithCoder:(NSCoder *)decoder
{
if((self = [super init]))
{
NSObject *a = [decoder decodeObject];
NSObject *b = [decoder decodeObject];
NSObject *c = [decoder decodeObject];
NSObject *d = [decoder decodeObject];
NSObject *e = [decoder decodeObject];
NSObject *f = [decoder decodeObject];
NSObject *g = [decoder decodeObject];
NSObject *h = [decoder decodeObject];
NSObject *i = [decoder decodeObject];
// NSObject *j = [decoder decodeObject];
// NSObject *k = [decoder decodeObject];
NSLog(@"test");
}
return self;
}
@end
基本上我被困在逆向工程 XRObjectAllocRun 类。但无论我解码多少对象,我总是收到以下异常:uncaught exception 'NSArchiverArchiveInconsistency', reason: '*** NSUnarchiver: inconsistency between written and read data for object 0x100112750'
如果取消注释最后两个 decode 语句,程序将崩溃并出现以下异常:uncaught exception 'NSArchiverArchiveInconsistency', reason: '*** file inconsistency: read 'i', expecting '@''。
有人知道Apples XRObjectAllocRun 类的签名吗?此类用于 Allocations 工具。
任何帮助都会很棒!
更新
我使用 Swift 并翻译了整个 *.trace-reader - 它失败并出现完全相同的错误:
import Foundation
import Cocoa
@objc(XRObjectAllocRun)
class XRObjectAllocRun: NSObject {
func initWithCoder(decoder:NSCoder){
var x = decoder.decodeObject()
// this is where things start breaking...
}
}
@objc(XRRun)
class XRRun: NSObject {
// to be implemented
}
@objc(XRTrackSegment)
class XRTrackSegment: NSObject {
func initWithCoder(decoder:NSCoder)->NSString{
var a = decoder.decodeObject()?.integerValue
var b = decoder.decodeObject()?.integerValue
var c = decoder.decodeObject()?.integerValue
var d = decoder.decodeObject()?.integerValue
var e = decoder.decodeObject()
return "test"
}
}
@objc(PFTTrackSegment)
class PFTTrackSegment: NSObject {
func initWithCoder(decoder:NSCoder){
var a = decoder.decodeObject()?.integerValue
var b = decoder.decodeObject()?.integerValue
var c = decoder.decodeObject()?.integerValue
var d = decoder.decodeObject()?.integerValue
var e = decoder.decodeObject()?.integerValue
var f = decoder.decodeObject()?.integerValue
}
}
// parse command line
var traceFilePath = Process.arguments[1]
println("input: \(traceFilePath)")
var traceFile = NSURL(fileURLWithPath: traceFilePath)
var error:NSError?
// check if the file exists
if (traceFile?.checkResourceIsReachableAndReturnError(&error) == false){
// file does not exist or cannot be accessed
println("\(error)")
exit(1)
}
var rawData = NSData(contentsOfURL: traceFile!)
var data = NSUnarchiver(forReadingWithData: rawData!)
var decodedObject: AnyObject? = data?.decodeObject()
println("\(decodedObject)")
【问题讨论】:
-
尝试看这里:github.com/JustSid/Traced 和这里:stackoverflow.com/questions/16737621/… 希望对您有所帮助!
-
谢谢,但这是我开始的地方。我正在使用代码示例并描述如何调整它。不幸的是,我无法像JustSid 那样弄清楚签名。
-
@MarcoPashkov 你有没有想过如何解析分配跟踪?我也遇到了同样的例外情况。
-
不幸的是还没有。我在 swift 方面取得了更多进展 - 但还没有。一旦我弄清楚了,我会发布答案。另外,由于我不是全职工作在这个问题上,我不能保证很快就会解决。
标签: ios objective-c xcode swift instruments