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

Android, CMDTool, stdout redirect, “Fatal signal 11 (SIGSEGV)”

燕富
2023-03-14

Android C命令行工具午餐“/system/bin/getprop”并将其标准输出重定向到套接字

启动“getprop”失败,返回“F/libc (20694):致命信号11 (SIGSEGV),代码1,tid 20694 (getprop)中的故障地址0x0”,代码

为什么我得到SIGSEGV?为什么分叉过程失败?

HRESULT ServiceCore::CreateProcessAndRedirectStdout(IN char* pCmd, IN char** args, OUT SOCKET& stdoutstream) {
    HRESULT hr      = S_OK;
    int     fds[2]  = { 0 };
    pid_t   pid     = 0;
    stdoutstream = 0;
    if (SOCKET_ERROR == socketpair(PF_UNIX, SOCK_STREAM, 0, fds))
        goto ErrExit;
    stdoutstream = fds[1];
    if((pid = fork()) < 0)
        goto ErrExit;
    if (pid == 0) {
        // The newly created process
        __android_log_print(ANDROID_LOG_INFO, "ServiceCore", "CreateProcessAndRedirectStdout>> '%s' started", pCmd);
        int newfd = dup2(fds[0], STDOUT_FILENO);
        __android_log_print(ANDROID_LOG_INFO, "ServiceCore", "CreateProcessAndRedirectStdout>> '%s' newfd:%d, oldfd:%d", pCmd, newfd, fds[0]);
        _ASSERT(newfd == STDOUT_FILENO);

        close(fds[0]);
        close(fds[1]);
        execvp(pCmd, args);
        __android_log_print(ANDROID_LOG_INFO, "ServiceCore", "CreateProcessAndRedirectStdout>> '%s' FAILED", pCmd);
        exit(1);
    }
    __android_log_print(ANDROID_LOG_INFO, "ServiceCore", "CreateProcessAndRedirectStdout>> '%s(%d)' Created", pCmd, pid);
    return S_OK;
ErrExit:
    if (0 != pid)
        kill(pid, SIGTERM);
    close(fds[0]);
    close(fds[1]);
    stdoutstream = 0;
    return hr;
}

...
        char* args[] = { 0 };
        SOCKET soc;
        if (SUCCEEDED(hr = CreateProcessAndRedirectStdout("/system/bin/getprop", args, soc))) {
            errno = 0;
            __android_log_print(ANDROID_LOG_INFO, "ServiceCore", "SendConfig>> Reading props");
            char pTmp[256000];
            int iRet = read(soc, pTmp, sizeof(pTmp));// Read the first few lines
        }

...
I/ServiceCore(20689): CreateProcessAndRedirectStdout>> '/system/bin/getprop(20694)' Created

I/ServiceCore(20689): SendConfig>> Reading props

I/ServiceCore(20694): CreateProcessAndRedirectStdout>> '/system/bin/getprop' started

I/ServiceCore(20694): CreateProcessAndRedirectStdout>> '/system/bin/getprop' newfd:1, oldfd:10

F/libc    (20694): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 20694 (getprop)

共有1个答案

钱星辰
2023-03-14

您正在以getprop未编写为处理的方式滥用execvp()。引用execvp()的OSX/BSD(但实际上是通用的)手册页

执行函数()、执行函数()和执行函数()提供指向空终止字符串的指针数组,这些字符串表示新程序可用的参数列表。按照惯例,第一个参数应该指向与正在执行的文件关联的文件名。指针数组必须以NULL指针终止。

当您应该将程序名作为第一个元素,后面跟着一个终止的空元素来传递时,您却通过传递一个空元素数组打破了这个约定。

这将<code>getprop

    if (argc == 1) {
        list_properties();

但是,如果它没有1个参数,它会假定它必须有两个或更多参数,并尝试取消引用第二个参数,该参数应该是您想要获取的属性的名称。

    property_get(argv[1], value, default_value);

将无效且可能为空的指针代替属性名传递给property_get()最终会在仿生libc内部失败,可能是__system_property_find()的实现调用strlen()。

如果您按照fadden的建议检查了堆栈跟踪,您可能会在libc中看到一个地址,可能是strlen()。

 类似资料:
  • JNI绑定 Android上的Java资源 WebView代码组织

  • Native.js for Android封装一条通过JS语法直接调用Native Java接口通道,通过plus.android可调用几乎所有的系统API。 方法: currentWebview: 获取当前Webview窗口对象的native层实例对象 newObject: 创建实例对象 getAttribute: 获取对象(类对象/实例对象)的属性值 setAttribute: 设置对象(类对

  • Android++ 是一个免费的 Visual Studio 扩展,用于支持在 Visual Studio 上开发和调试原生的 Android 应用,主要基于 NDK 的 C/C++ 应用。同时包括可订制的发布、资源管理以及集成了 Java 源码编译。

  • Android(安卓)是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国谷歌公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由谷歌收购注资。2007年11月,谷歌与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后谷歌以Apache许可证的授

  • Android(安卓)是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国谷歌公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由谷歌收购注资。2007年11月,谷歌与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后谷歌以Apache许可证的授

  • 简介 该库提供J2SE的Swing、AWT等类的安卓实现,引用该库便能在Android上运行J2SE应用程序。 该库实现大多数必需功能,但不是全部的J2SE。 成功示例HomeCenter服务器,该服务器基于J2SE,同时完全运行于Android之上。 使用指引 该库依赖于开源工程HomeCenter。 它不含Activity,需另建Android工程,并引用本库。 Activity和res需作为