【问题标题】:Linux c++ system() call crash when function returns函数返回时Linux c ++ system()调用崩溃
【发布时间】:2017-04-29 21:55:54
【问题描述】:

我有一个自定义的 petalinux 2016.3 系统正在运行并观察以下内容: 当我编译并运行一个使用 system() 调用的 cpp 时,如下例所示:

Oops: kernel access of bad area, sig: 11
CPU: 0 PID: 381 Comm: Application Not tainted 4.6.0 #63
task: ce486500 ti: ce4cc000 task.ti: ce4cc000

我可以在终端中看到所有 3 个回声,但 Oops 出现在“我们永远不会到达这里”printf 之前。当function()返回时,似乎出现了坏区的内核访问。

是否缺少某些特定的内核或 rootfs 模块/设置可能使系统出现这种行为?

我有几千行代码运行其他库函数,而且似乎只有 system() 失败了。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

using namespace std;

void function(){
  system("echo hello");
  system("echo hello2");
  system("echo hello3");
}

int main(int argc, char **argv){
  function();
  printf("We never get here\n");
  return 1;
}

经过更多调试,问题似乎来自于 makefile (lEasyBmp) 中包含的库。

为什么它在不使用时触发了这个确切的失败我还没有发现。所有的库文件都是在系统中构建和找到的,但是如果有人遇到同样的问题,包括一些库可能会触发它。

【问题讨论】:

标签: c++ linux


【解决方案1】:

看起来问题实际上是 system() 函数导致了一些非常奇怪的未定义行为。 像下面这样把它们放在一个孩子身上已经解决了这个问题:

void forksystem(char* command){
    pid_t pid;
    int status = 0;
    pid = fork();
    if(pid == 0){
      system(command);
      exit(1);
    }
    wait(&status);
}

【讨论】:

    【解决方案2】:

    我认为问题出在您正在使用的内核上。

    我刚刚在我的 ubuntu 中运行了相同的代码,它运行良好。

    分析生成的核心文件。内核 oops 消息可能包含必要的信息。还要检查您使用的内核版本是否存在任何已知问题。

    snagendr@SUPERMAN:~/C$ ./a.out 
    hello
    hello2
    hello3
    We never get here
    

    【讨论】:

      【解决方案3】:

      哎呀是内核打印。 您的内核中的某些内容运行不正常。 尝试更新它,而不是重新编译,或者,如果您正在交叉编译应用程序,您的工具链没有为您的系统配置好。

      您的 MMU 似乎运行不正常。内核尝试访问用户空间内存或未映射/保留区域。

      【讨论】:

        猜你喜欢
        • 2016-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多