ฉันต้องการบันทึกการติดตามการโทรในบางจุดเช่นการยืนยันที่ล้มเหลวหรือข้อยกเว้นที่ไม่ได้ตรวจสอบ
ฉันต้องการบันทึกการติดตามการโทรในบางจุดเช่นการยืนยันที่ล้มเหลวหรือข้อยกเว้นที่ไม่ได้ตรวจสอบ
คำตอบ:
คำตอบของ n13 ไม่ได้ผล - ฉันปรับเปลี่ยนเล็กน้อยเพื่อให้ได้สิ่งนี้
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
int retval;
@try{
retval = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
@catch (NSException *exception)
{
NSLog(@"Gosh!!! %@", [exception callStackSymbols]);
@throw;
}
return retval;
}
}
NSLog(@"[Error] - %@ %@", exception.name, exception.reason);
หากคุณต้องการข้อยกเว้นที่แท้จริงเช่นกัน
Cocoa ได้บันทึกการติดตามสแต็กบนข้อยกเว้นที่ไม่ได้ตรวจสอบไปยังคอนโซลแล้วแม้ว่าพวกเขาจะเป็นเพียงที่อยู่หน่วยความจำแบบดิบ หากคุณต้องการข้อมูลเชิงสัญลักษณ์ในคอนโซลมีโค้ดตัวอย่างจาก Apple
หากคุณต้องการสร้างการติดตามสแต็คที่จุดตามอำเภอใจในรหัสของคุณ (และคุณอยู่ใน Leopard) ดูหน้าคนย้อนหลัง ก่อน Leopard คุณต้องขุดผ่าน call stack เอง
นี้สวยมากจะบอกคุณว่าจะทำอย่างไร
โดยพื้นฐานแล้วคุณจำเป็นต้องตั้งค่าการจัดการข้อยกเว้นแอปพลิเคชันเพื่อเข้าสู่ระบบสิ่งที่ชอบ:
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
สำหรับข้อยกเว้นคุณสามารถใช้สมาชิก NSStackTraceKey ของพจนานุกรม userInfo ของข้อยกเว้นเพื่อทำสิ่งนี้ ดูการควบคุมการตอบสนองของโปรแกรมต่อข้อยกเว้นบนเว็บไซต์ของ Apple
ในการพิมพ์อย่างรวดเร็วด้วยวิธีนี้:
print("stack trace:\(Thread.callStackSymbols)")
backtrace
และbacktrace_symbols
ฟังก์ชั่น ดู mantrace (3) manpage