当功能返回时,Linux C 系统()调用崩溃

Linux c++ system() call crash when function returns

本文关键字:系统 调用 崩溃 Linux 功能 返回      更新时间:2023-10-16

我有一个自定义的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模块/设置可以使系统以这种方式行事?

我有几千行的代码运行其他库功能,而似乎失败的系统()。

#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 heren");
  return 1;
}

在进行了更多调试之后,问题似乎来自Makefile(leasyBMP)中的库。

为什么不使用时会触发这种确切的故障。所有库文件都是在系统中构建和找到的,但是如果有人遇到相同的问题,包括某些库可能会触发它。

似乎问题实际上是系统()函数,导致一些非常奇怪的不确定行为。将它们放在以下孩子中解决了问题:

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

我认为问题是与您一起工作的内核。

我只是在Ubuntu中运行了相同的代码,它可以正常工作。

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

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

oops是内核印刷。内核中的某些东西不正常。尝试更新它,而不是重新编译,或者,如果您要交叉编译应用程序,则您的工具链对系统配置不佳。

似乎您的MMU工作不佳。内核尝试访问用户空间存储器或未绘制的未藏品/保留区域。