linux下的段错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下的段错误相关的知识,希望对你有一定的参考价值。

#include <unistd.h>
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <sys/ioctl.h>
#define MAX 30
static char buf[10];
static char buf1[64];

int main()

int on;
char cmd;
char file[]="./hello.txt";
int fd,fd1,fd2;
int tmp;
int bytes,length,res;
fd=open("/dev/cb",O_RDWR);
if(fd < 0)
printf("####cb device open fail####\n");
return (-1);


fd1=open("/dev/cewen",O_RDWR);
if(fd < 0)

printf("####cewen device open fail####\n");
return (-1);


if((fd2=open(file,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)

fprintf(stderr,"open %s Error.%s",file,strerror(errno));
exit(0);


while(1)

read(fd,buf,MAX);
tmp=buf[0];
ioctl(fd1,tmp,0);
printf("%s",tmp);

strcpy(buf1, "hello,word\n");
length = strlen(buf1);
printf("%s",buf1);
if (!(res = write(fd2, buf1, length)))

printf("Error writing to the file.\n");
exit(1);



close(fd);
close(fd1);
close(fd2);
return 0;



请教哪个大侠帮帮忙解决下
打开文件都正确,应该是写的时候出现的段错误

.....
while(1)
read(fd,buf,MAX);
tmp=buf[0];
ioctl(fd1,tmp,0);
printf("%d",tmp); //试试把这个%s改成%d后还有错误没
.....
参考技术A 同学,要学会自己调试程序。GDB嫌麻烦的话,printf也可以啊

1. read(fd,buf,MAX); 这里即使现在不出问题,也不能保证以后不出问题
2. ioctl(fd1,tmp,0); 请确认你的ioctl调用没有问题
参考技术B .....
while(1)
read(fd,buf,MAX);
tmp=buf[0];
ioctl(fd1,tmp,0);
printf("%d",tmp);
//试试把这个%s改成%d后还有错误没
.....

相当于 Windows/MSVC 上的段错误?

【中文标题】相当于 Windows/MSVC 上的段错误?【英文标题】:Equivalent of segfault on Windows/MSVC? 【发布时间】:2019-10-17 23:20:58 【问题描述】:

在 Linux 上,以下代码:

long* p = (long*)reinterpret_cast<void*>(0x634963963496034) // random memory address
std::cout << *p;

可能会导致读取尚未分配的内存,并且程序将引发 SIGSEGV 信号。否则称为段错误。 (可以通过sigaction(2) 附加操作)。

Windows/MSVC 上是否有等效机制?

以上代码在 Windows 上会做什么?有什么办法可以捕获这种内存访问冲突,并运行用户提供的函数?

【问题讨论】:

https://docs.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=vs-2019 【参考方案1】:

在 Windows 上,当使用 Structured Exception Handling 捕获异常时,宏 GetExceptionCode() 将返回 EXCEPTION_ACCESS_VIOLATION

还可以使用 C++ 异常处理来捕获 SEH 异常,如 here 所述。

【讨论】:

【参考方案2】:

我正在寻找的是SetUnhandledExceptionFilter。对于此用例,Windows 上的 SetUnhandledExceptionFilter 等效于 Linux 上的 sigaction

【讨论】:

以上是关于linux下的段错误的主要内容,如果未能解决你的问题,请参考以下文章

关于Linux下的段错误

段错误详解

linux中的段错误,百度了很久都没有找到类似的情况。望高手们指点......

glEnableVertexArrayAttrib 生成的段错误

Linux环境下段错误的产生原因及调试方法小结

std::atomic 负载中的段错误?