免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 12317 | 回复: 34
打印 上一主题 下一主题

linux下驱动能否进行单步调试 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-07 09:27 |只看该作者 |倒序浏览
初涉驱动的开发,写了代码编译没有问题,但是insmod时会出现一些问题,显示很多类似汇编的语句,好像是访问空间有问题,很是郁闷,但是又不知道是哪里出错,想问问有没有类似于单步调试的方法,或者其他调试的方法,希望大侠们帮帮忙,谢谢

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2009-12-07 09:41 |只看该作者

回复 #1 mingyuexuan 的帖子

gdb,你可以查查相关资料

论坛徽章:
0
3 [报告]
发表于 2009-12-07 09:44 |只看该作者

内核模块,记得说明内核版本,贴init代码,完整代码如不大可贴全部代码

rt

[ 本帖最后由 奇门遁甲-lu 于 2009-12-7 09:45 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-12-07 09:57 |只看该作者

回复 #2 dreamice 的帖子

谢谢,我刚才看了一下那些汇编语句,原来是程序执行过程,然后到出错的地方开始提示堆栈信息,不过我对gdb不了解,能提供一些相关的资料吗,我是从十月份才开始接触linux,所以很多东西都很陌生,需要学习,可是时间不够,所以想偷个懒...

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
5 [报告]
发表于 2009-12-07 10:12 |只看该作者
方便把代码贴出来吗?
大伙一起看一下

论坛徽章:
0
6 [报告]
发表于 2009-12-07 10:24 |只看该作者

回复 #5 T-Bagwell 的帖子

代码很长,那我就只把probe函数贴出来
static void ml505_dev_setup_cdev(struct cdev* dev,int index)
{
        int err,devno = MKDEV(ml505_major,index);
       
        cdev_init(&dev,&ml505_dev_fops);
        dev->owner = THIS_MODULE;
        dev->ops = &ml505_dev_fops;
        err = cdev_add(dev,devno,1);

        if(err)
        {
                printk("Error %d adding LED%d",err,index);
        }

}

int ml505_dev_init (void)
{
        int result ;
        dev_t devno = MKDEV(ml505_major,0);

        if(ml505_major)
        {
                result = register_chrdev_region(devno,1,"ml505_dev");
        }
        else               //动态申请设备号
        {
                result = alloc_chrdev_region(&devno,0,1,"ml505_dev");
                ml505_major = MAJOR(devno);
        }

        if(result<0)
                return result;
        ml505_cdev = cdev_alloc();

        if(ml505_cdev == NULL)
        {
                result = -ENOMEM;
                goto fail_malloc;
        }

        ml505_dev_setup_cdev(ml505_cdev,0);
        init_MUTEX(&r_sem);                  
        init_MUTEX(&w_sem);
        init_MUTEX(&sem);
        return 0;
        fail_malloc: unregister_chrdev_region(devno,1);
        return result;

}       

static int __init ml505_probe(struct pci_dev *pci_dev,const struct pci_device_id *pci_id)
{
        pdev = pci_dev;
        pci_enable_device(pci_dev);                  //启动PCI设备
        /*读取pci配置信息*/
        iobase = pci_resource_start(pci_dev,0);      //iobase为配置空间首地址
        iobase_len = pci_resource_len(pci_dev,0);    //配置空间的大小
        request_mem_region((unsigned long)iobase,(unsigned long)iobase_len,"ml505_dev");
        pci_set_master(pci_dev);                    //设置成总线DMA模式
        pci_request_regions(pci_dev,(char *)THIS_MODULE);          //申请IO资源

      /*注册字符设备*/
        ml505_dev_init();
        phy_to_vir = (unsigned int *)ioremap((unsigned long)iobase,(unsigned long)iobase_len);     //将PCI设备的寄存器空间映射为虚拟地址空间
        return 0;
}

论坛徽章:
0
7 [报告]
发表于 2009-12-07 10:58 |只看该作者
驱动单步调试,这个,你能让硬件单步么?

“然后到出错的地方开始提示堆栈信息”把这个贴出来。

论坛徽章:
0
8 [报告]
发表于 2009-12-07 11:24 |只看该作者

回复 #7 zyr-linux 的帖子

我指的单步是指在进行probe的时候单步
错误提示:
EIP:[<f8bf0269>] ml505_dev_init + 0x90/0x13f [ml505] SS:ESP 0068:f5020dd8
segmentation fault

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
9 [报告]
发表于 2009-12-07 11:57 |只看该作者
原帖由 mingyuexuan 于 2009-12-7 11:24 发表
我指的单步是指在进行probe的时候单步
错误提示:
EIP:[] ml505_dev_init + 0x90/0x13f [ml505] SS:ESP 0068:f5020dd8
segmentation fault


段错误,可能是指针跑飞了

论坛徽章:
0
10 [报告]
发表于 2009-12-07 12:18 |只看该作者

回复 #9 dreamice 的帖子

谢谢,我再仔细看看代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP