我从位置libobjc.A.dylib和CoreFoundation设置了全局断点.我运行我的iPhone应用程序,它遇到了异常.XCode在断点处停止但在日志中没有显示任何错误:待定断点1 - "objc_exception_throw"已解决待定断点2 - " - [NSException raise]"已解决
我单击控制台上的"继续"按钮,在启用断点之前,我收到了与之前无法区分的错误.
如何获得设置全局断点的堆栈跟踪应该生成?
新版本AIR使我们能够全局捕获运行时错误并处理它们.问题是除了错误ID和错误消息和名称之外,它没有堆栈跟踪或有关错误的任何有用信息.例如,它可能告诉我发生了空指针异常,但它不会告诉我在哪里或哪个方法或任何东西.运行时的调试版本为我们提供了所有这些,但是当应用程序部署到客户时,它没有在调试版本上运行,因此没有任何有用的信息可用.我想知道这个小组是否有任何关于如何在AIR应用程序中更好地记录错误的建议,以便更好地支持产品.有什么建议?
我使用自定义图层绘制我的UIView.为了使图层无效和更新,我需要将我的视图设置为我的代表CALayer.当这样做是正确吸取我的文字,但是当视图接收触摸应用程序崩溃.我做错了什么?
- (void) layoutSubView {
if (drawLayer == nil) {
drawLayer = [[CALayer alloc] init];
[drawLayer setDelegate:self];
[[self layer] addSublayer:drawLayer];
}
[drawLayer setFrame:[self bounds]];
[drawLayer setNeedsDisplay];
}
Run Code Online (Sandbox Code Playgroud)
上面是我设置CALayer的代码,下面是重写的drawLayer方法.
- (void) drawLayer:(CALayer *)layer
inContext:(CGContextRef)ctx {
if (layer == drawLayer) {
UIGraphicsPushContext(ctx);
[self drawTitle:ctx];
UIGraphicsPopContext();
}
}
Run Code Online (Sandbox Code Playgroud)
这是堆栈.
使用org.apache.log4j.jdbc.JDBCAppender,我怎样才能记录warn和error使用PatternLayout.
我正在登录
logger.warn("warning description", e);
logger.error("error description", e);
Run Code Online (Sandbox Code Playgroud)
我将String描述放入表中,但Throwable的堆栈跟踪现在在哪里.是否有其他参数可以通过PatternLayout.目前我正在使用
"INSERT INTO app_logs (app, log_date, log_level, location, loc, message) VALUES ('my-apps-name', '%d{ISO8601}','%p', '%C.java', '%C{1}.java:%L', '%m')"
Run Code Online (Sandbox Code Playgroud)
进入一张桌子
TABLE `app_logs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`app` varchar(255) DEFAULT NULL,
`log_date` varchar(255) DEFAULT NULL,
`log_level` varchar(255) DEFAULT NULL,
`location` varchar(255) DEFAULT NULL,
`loc` varchar(255) DEFAULT NULL,
`message` text,
PRIMARY KEY (`id`)
)
Run Code Online (Sandbox Code Playgroud) 我已阅读(参见此处)在Linux下的故障信号处理程序(例如处理时)使用backtrace()打印堆栈跟踪的"常见做法" SIGSEGV是:
1 从未记录的结构中获取指令指针(EIP或RIP)sigcontext.
2用指令指针替换堆栈轨迹中的第2帧,因为第一帧是信号处理程序,第2帧应该libc在sigaction代码中,它覆盖了发生故障的原始帧.
3从新更换的第2帧开始打印回溯.
在我的测试中(在x86_642.6内核上),实际上发生故障的原始帧存在于backtrace()第3帧中给出的堆栈跟踪中 - 第一个是信号处理程序,第二个是libc信号处理代码.
内核信号处理的这种变化是否记录在某个地方,您可以参考我?
在我看来,结果是你可以避免从指令指针替换任何帧,并从第backtrace()3帧开始打印堆栈跟踪,但我想确认这是已知的行为和正确的方法.
在Android 2.3.3上,我正在使用API方法批量导入我的一个SQLite表:
SQLiteDatabase.insert(String table,String nullColumnHack,ContentValues values)
它工作正常,但如果任何行存在数据库错误(例如约束错误),则会将完整的堆栈跟踪写入Android Logcat,这会迅速填满.
如何关闭此堆栈跟踪?
我已经处理了任何异常抛出但是Logcat正在SQLite库代码中被污染.
我担心移动设备的性能.
应该强制执行约束并且我将处理违规,但是Logcat中每次违规的20行堆栈跟踪乘以数百次违规是我想要关闭的.
不幸的是,我也无法使用Android Froyo引入的高级冲突处理,因为应用程序也必须在旧设备上运行.
干杯.
在堆栈跟踪中 - 在最后一个方法中,在最后一个方法之前的方法中或在随后的方法中发生异常(即由于异常而没有达到那么远)?
那么,在下面的例子中,Method3是发生异常的方法吗?或者它是'Method4'(它只能完成方法3)?
STACK TRACE:
Method3()
Method2()
Method1()
Run Code Online (Sandbox Code Playgroud) 这个问题已被多次询问,但它从未得到过真正的回答.今天我花了5到6个小时试图将一些库移植到Android(libunwind,liwdfl),这些库可能从未打算用于ARM.当然无济于事.
问题是Android缺乏backtrace/ backtrace_symbols功能.有没有人找到一种方法来打印stacktrace,比如收到SIGSEGV?
我正在测试一些代码来读取类路径中可用的文件,但最后我得到了一些与Throwable类的printStackTrace()方法相关的有趣的东西.
这是代码:
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.net.URL;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
public class Main {
public static void main(String[] args) throws IOException, URISyntaxException {
try {
System.out.println("before-test1");
test1(); // will throw exception
System.out.println("after-test1");
} catch (Exception e) {
System.out.println("entering catch-1");
e.printStackTrace();
System.out.println("exiting catch-1");
}
try {
System.out.println("before-test2");
test2();
System.out.println("after-test2");
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println("before-test3");
test3();
System.out.println("after-test3");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void test1() throws IOException …Run Code Online (Sandbox Code Playgroud) 我继承了Exception类来创建自己的异常.类似下面的代码
public class ApplicationException extends Exception {
ApplicationException(String errorMessage) {
super(errorMessage);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是堆栈跟踪始终为空.以下代码将不会向控制台写入任何内容.
ApplicationException(String errorMessage) {
super(errorMessage);
System.out.println(this.getStackTrace());
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它是空的,因为它Throwable(String)正在呼唤fillInStackTrace method.有没有办法填写Stack,还是我应该做的其他事情?