当功能返回时,Linux C 系统()调用崩溃
Linux c++ system() call crash when function returns
我有一个自定义的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工作不佳。内核尝试访问用户空间存储器或未绘制的未藏品/保留区域。
相关文章:
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 如何将C++系统调用连接到 freertos
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 系统调用:一次和多次,哪个更好?
- 使用路径和空格的系统调用
- 是否有等效于 macOS 上的 clone() 系统调用?
- 从C++调用系统调用节点?
- C++测试程序中的非法系统调用(对角矩阵元素程序的总和)
- 英特尔 Pin:如何获取系统调用的返回地址
- 如何使用低级系统调用从 stdin 和输入文件中获取字节数
- 使用模拟器C++从RISC-V裸机程序调用printf系统调用时失败
- 动态执行的 ARM ASM 系统调用,可从C++重新定位
- 如何知道我正在使用的Linux OS是否具有特定的系统调用
- 当C 中的系统调用conconculables时,参数字符串中的字符损失
- 调用系统调用函数时出现异常
- 在 boost::asio 中自定义套接字/关闭系统调用
- 系统调用失败"Incorrect Section Name -e" C++
- 绕过系统调用 C++
- 以非 root 用户身份调用 mount() 系统调用