我有一个multithreading的C程序,它在程序中的特定点处始终产生分段错误。 当我用gdb运行它时,没有显示错误。 你能想到为什么只有在不使用debugging器时才会发生故障的原因吗? 这是非常烦人的不能用它来find问题!
什么是SEGV_MAPERR ,为什么总是想出SIGSEGV ?
我将项目移动到新的Android本地开发工具包(即JNI),我想赶上SIGSEGV,如果它发生(也可能是SIGILL,SIGABRT,SIGFPE),以提供一个很好的崩溃报告对话框,而不是(或之前)目前发生的事情:该进程的直接不必要的死亡,以及操作系统可能尝试重启该进程。 ( 编辑: JVM / Dalvik虚拟机捕捉信号并logging堆栈跟踪和其他有用的信息;我只是想提供给用户的选项,真正的电子邮件信息给我)。 情况是:大量的C代码我没有写在这个应用程序的大部分工作(所有的游戏逻辑),虽然它在许多其他平台上经过了充分的testing,但是我完全有可能在我的Android端口,会喂它垃圾并导致在本机代码崩溃,所以我想崩溃转储(本机和Java),目前在Android日志中显示(我想这将是在非Android情况下stderr)。 我可以自由地修改C和Java代码,尽pipecallback函数(进出JNI)的数量大约为40,显然,小差异的奖励点。 我听说过J2SE中的信号链接库libjsig.so,如果我可以在Android上安全地安装一个信号处理程序,这将解决我的问题的捕捉部分,但是我看不到Android / Dalvik这样的库。
我一直在阅读其他文章,追踪在Android应用程序中获取SIGSEGV的原因。 我计划扫描我的应用程序可能的NullPointers相关的canvas使用,但我的SIGSEGV barfs上一个不同的内存地址每次。 另外我见过的code=1和code=2 。 如果内存地址是0x00000000 ,我会有一个线索,它是一个空指针。 我得到的最后一个是code=2 : A/libc(4969): Fatal signal 11 (SIGSEGV) at 0x42a637d9 (code=2) 有关如何跟踪这个问题的任何build议? 我有一个嫌疑犯,但我不想尝试它。 我的应用程序使用OSMDroid API进行离线映射。 OverlayItem类表示地图上的标记/节点。 我有一个服务,通过networking收集数据来填充OverlayItem,然后显示在地图上。 为了简化我的devise,我将OverlayItem扩展到了我自己的NodeOverlayItem类中,该类包含了我在UI活动和服务中使用的一些附加属性。 这给了我一个关于UI和服务的单项信息。 我使用Intents广播到活动刷新UI地图时,一些改变。 活动绑定到服务,并有一个服务方法来获取NodeOverlayItem的列表。 我想这可能是OSMDroid API使用OverlayItem,同时我的Service更新节点信息。 (并发问题) 当我写这篇文章时,我认为这确实是个问题。 令人头疼的是NodeOverlayItem没有将Node和OverlayItem分开,这就是Activity需要来自Node的一些数据,这个Service就是这样。 另外当Activity被创build时(onResume等等),OverlayItem对象将需要从活动不在时服务一直维护的Node数据重新创build。 例如,您启动应用程序,服务收集数据,用户界面显示它,你回家,然后回到应用程序,活动将需要拉动,并从最新的服务节点数据重新创buildOverlayItem的。 我知道这不是一个很好的或明确的问题。 这就像我所有的问题都是利基或模糊的。 如果任何人有关于如何解释这些SIGSEGV错误的build议,将不胜感激! 更新这是debugging会话期间捕获的最新的崩溃。 我有3个这些设备用于testing,当我正在开发和testing时,它们并不全部可靠地崩溃。 我包括了一些额外的东西,所以GC日志logging可以注意到。 你可以看到这个问题可能与内存耗尽无关。 03-03 02:02:38.328: I/CommService(7477): Received packet from: 192.168.1.102 03-03 02:02:38.328: I/CommService(7477): Already processed this packet. […]