ppc-linux平台的奇怪问题

发布于 2022-09-22 14:15:37 字数 412 浏览 17 评论 0

应用程序在一个循环中通过ioctl()给驱动发命令,结果发送第9次时候出现Segmentation fault,百思不得其解,请高人指点一二

char dat[20];
...

for(...)
{
     GetData(dat);

     if(Valid(dat))
    {
          ioctl(fd,...,dat);
    }
}
...

据说这种错误常是非法指针引起的,但怎么也不能发现问题。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

情愿 2022-09-29 14:15:37

用打印跟踪过了,发现还没有跑到驱动file_operations.ioctl()中就出错了

留蓝 2022-09-29 14:15:37

听听版主怎么解释,也好学习学习

陌上青苔 2022-09-29 14:15:37

原帖由 garyv 于 2008-11-19 22:32 发表
用打印跟踪过了,发现还没有跑到驱动file_operations.ioctl()中就出错了

GetData(dat);

     if(Valid(dat))
这两个函数是做什么的?

祁梦 2022-09-29 14:15:37

全是框架,没有代码,让版主怎么说啊

倾城泪 2022-09-29 14:15:37

GetDat(dat) -- 读入dat数组大小的数据,会进入内核阻塞读
Valid(dat) -- 检查数据格式是否正确,不会修改数据

ioctl()之前有过memcpy()操作,但是memcpy()的第三个参数限制大小,不会有数组越界的问题
调用ioctl()之前的printk()都可以输出的,第9次调用ioctl()之后就出错而且出错时会自动调用file_operations.release()卸载驱动,最后打印出: Segmentation fault,回到命令行。

对你再特殊 2022-09-29 14:15:37

原帖由 garyv 于 2008-11-20 18:19 发表
GetDat(dat) -- 读入dat数组大小的数据,会进入内核阻塞读
Valid(dat) -- 检查数据格式是否正确,不会修改数据

ioctl()之前有过memcpy()操作,但是memcpy()的第三个参数限制大小,不会有数组越界的问题
调 ...

你最好把代码实现贴出来,不然根本没办法分析定位啊

紫﹏色ふ单纯 2022-09-29 14:15:37

问题已经解决了。是因为有个地方把一个函数指针修改到了一个非函数入口地址,导致用这个函数指针调用函数时候出现Segmentation fault,看来这种错误十有八九都是指针相关问题引起的,还以为是ioctl()进入内核里面出错了,内核BUG不是那么容易被碰到的^_^

霞映澄塘 2022-09-29 14:15:37

原帖由 garyv 于 2008-11-21 15:25 发表
问题已经解决了。是因为有个地方把一个函数指针修改到了一个非函数入口地址,导致用这个函数指针调用函数时候出现Segmentation fault,看来这种错误十有八九都是指针相关问题引起的,还以为是ioctl()进入内核里 ...

恭喜解决,希望总结经验供大家分享

她比我温柔 2022-09-29 14:15:37

经验很简单:多读源码,要有耐心!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文