我一直在尝试阅读一个.trace文件,这个文件是我使用一个自定义工具模板(instruments: Automator, Allocations, Leaks)生成的,使用了Instruments。在这个stackoverflow answer中,我找到了最好的帮助。基本上,author创建了一个自定义的Objective-C程序(Traced),用于读取特定类型的苹果.trace文件(工具:OpenGL ES Driver)。他的答案面向XCode 4.6。
代码仍然可以与XCode 6.1一起使用,但跟踪文件似乎有些变化。您必须在
简单运行Traced程序使我得到了
这个错误最初很容易弄清楚。我所要做的就是实现缺少的类
这就是我所到达的地方,也是我卡住的地方。
基本上我陷入了“反向工程”
如果取消注释最后两个
有人知道苹果的XRObjectAllocRun类的签名吗?此类用于“分配”仪器。
任何帮助都将非常感激!
更新
我尝试了Swift并翻译了整个
代码仍然可以与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:对象0x100112750的写入和读取数据不一致'
。如果取消注释最后两个
decode
语句,程序将崩溃并显示此异常:uncaught exception 'NSArchiverArchiveInconsistency',reason: '***文件不一致:读取'i',期望'@''
。有人知道苹果的XRObjectAllocRun类的签名吗?此类用于“分配”仪器。
任何帮助都将非常感激!
更新
我尝试了Swift并翻译了整个
*.trace
阅读器——它以完全相同的错误失败: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)")