当前位置: 首页 > 知识库问答 >
问题:

如何从客户设备中找到相关的死亡情况?

彭成天
2023-03-14

我的 Android 应用 (Java NDK) 报告了许多由0xdeadd00d导致的崩溃(信号)。众所周知,它是Dalvik VM中止的简写。这些都没有发生在我的JNI调用中,但信号处理发生在本地世界。但是,本机崩溃报告通常报告的内容(寄存器,堆栈)对于调试这些内容毫无用处。

有办法从原生信号处理程序到达Java调用栈吗?或者转储最近logcat活动的一部分?

共有1个答案

巢海
2023-03-14

解决方案:在信号处理程序中为deadd00d引入一个特殊条件。读取logcat的最后1024字节,将其插入崩溃日志。

我通过这种方式得到了一些不错的诊断。

//n is the length of the file tail to read
//Returns # of byte read
size_t ReadLogcat(char *Buf, size_t n)
{
    char s[sizeof(s_DataPath) + 30];
    //s_DataPath contains the result of Context.getDir("Data")

    strcpy(s, "logcat -d -f ");
    char *fn = s + strlen(s);
    strcat(s, s_DataPath);
    strcat(s, "/logcat"); //Temp file for the logcat
    size_t r = 0;
    system(s); //Dump the snapshot of the logcat into the file called logcat
    FILE *f = fopen(fn, "r");
    if(f)
    {
        fseek(f, -n, SEEK_END); //We need the end of the file
        r = fread(Buf, 1, n, f);
        fclose(f);
    }
    unlink(fn); //Don't need the logcat file anymore
    return r;
}

static void DumpLogcat(FILE *f)
{
    char Buf[1024];
    size_t r;
    if(r = ReadLogcat(Buf, sizeof(Buf)))
    {
        fputs("\nLogcat:\n", f);
        fwrite(Buf, 1, r, f);
    }
}

void OnSignal(int signal, siginfo_t *si, void *p)
{
    FILE *f = OpenCrashLog(); //opens a file in the data dir; details are irrelevant

    //Lots of data dumping here... Version, stack, registers, etc.
    //...

    if((unsigned)si->si_addr == 0xdeadd00d) //Try and dump some Logcat
        DumpLogcat(f);
}
 类似资料:
  • 问题内容: 我想超时并杀死空闲的Redis客户端。有可以设置的设置吗?我似乎记得在某处设置配置,但似乎再也找不到了。 我希望这是自动完成的,而不是手动调用client kill命令。 问题答案: 查看Redis配置文件(用于启动Redis的文件)​​。 只需检查未注释掉的参数,然后更改超时参数以将非零值放入秒中即可。应该重新启动实例以考虑到此参数。 要在正在运行的Redis实例上更改此参数,可以使

  • 我们试图用任何google帐户登录我的worklight混合移动示例应用程序。 下面是创建google gmail API和创建OAuth 2.0客户端ID的屏幕截图步骤 错误日志中没有错误,只有这里引用的页面加载错误。我们得到这样的屏幕截图错误

  • 我成功地集成了firebase。当我仅出于测试目的使用firebase站点的云消息发送通知时,设备会收到通知。但在我的应用程序中,我需要使用firebase从一台设备向另一台设备发送通知。。如何实现这一点。Swift 4,Xcode 10以下是一些代码:

  • 问题内容: 我正在学习Java的死锁,并且有来自Sun官方教程的以下示例代码: 阿方斯(Alphonse)和加斯顿(Gaston)是朋友,也是礼貌的忠实信徒。严格的礼貌规则是当您向朋友鞠躬时,您必须保持鞠躬,直到您的朋友有机会归还弓箭为止。不幸的是,该规则不能解决两个朋友可能同时鞠躬的可能性。 这是Sun的解释: 死锁运行时,两个线程极有可能在尝试调用bowBack时阻塞。两个块都不会结束,因为每

  • 主要问题: 我试图在网页上打印错误,如果连接到MySQL服务器不做。为此,我写了一个错误的库名

  • 问题内容: 获取Linux系统上所有可用串行端口/设备列表的正确方法是什么? 换句话说,当我遍历中的所有设备时,如何以经典方式分辨哪些设备是串行端口,即那些通常支持波特率和RTS / CTS 流控制的设备? 解决方案将用C编码。 我问是因为我正在使用第三方库,但这样做显然是错误的:它似乎仅在上进行迭代。问题是,例如,存在USB上的串行端口(由USB- RS232适配器提供),而这些端口在/ dev