当前位置:  技术问答>linux和unix

关于系统函数重载

    来源: 互联网  发布时间:2017-01-06

    本文导语:  比如我重载 chdir asmlinkage int (* orig_chdir)(const char *path); 只要我返回错误代码 -1 -2 这种  就会出这样的问题 [36113.544621] BUG: unable to handle kernel NULL pointer dereference at (null) [36113.544625] IP: [] get_fullname+0xd7/0x...

比如我重载 chdir
asmlinkage int (* orig_chdir)(const char *path);


只要我返回错误代码 -1 -2 这种  就会出这样的问题

[36113.544621] BUG: unable to handle kernel NULL pointer dereference at (null)
[36113.544625] IP: [] get_fullname+0xd7/0x1f0 [GetModule]
[36113.544632] *pde = 1fb4f067 *pte = 00000000 
[36113.544635] Oops: 0002 [#16] SMP 
[36113.544638] last sysfs file: /sys/devices/pci0000:00/0000:00:11.0/0000:02:03.0/local_cpus
[36113.544641] Modules linked in: GetModule(P) binfmt_misc acpiphp snd_ens1371 gameport snd_ac97_codec ac97_bus snd_pcm_oss snd_mixer_oss snd_pcm snd_seq_dummy snd_seq_oss snd_seq_midi snd_rawmidi snd_seq_midi_event fbcon tileblit font bitblit softcursor snd_seq psmouse serio_raw ppdev snd_timer snd_seq_device parport_pc snd vga16fb vgastate soundcore snd_page_alloc lp shpchp intel_agp i2c_piix4 agpgart parport floppy pcnet32 mii mptspi mptscsih mptbase scsi_transport_spi [last unloaded: GetModule]
[36113.544672] 
[36113.544675] Pid: 25993, comm: bash Tainted: P      D    (2.6.32-34-generic #77-Ubuntu) VMware Virtual Platform
[36113.544681] EIP: 0060:[] EFLAGS: 00210206 CPU: 1
[36113.544683] EIP is at get_fullname+0xd7/0x1f0 [GetModule]
[36113.544685] EAX: dfb11b6e EBX: 00000000 ECX: 0000001e EDX: dfb11b50
[36113.544687] ESI: df597d1c EDI: dfb11c50 EBP: dfb11d60 ESP: dfb11b44
[36113.544688]  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
[36113.544691] Process bash (pid: 25993, ti=dfb10000 task=d65fcc80 task.ti=dfb10000)
[36113.544692] Stack:
[36113.544693]  dfb11e74 093184a8 00000000 6d6f682f 6d652f65 6e61687a 72702f67 63656a6f
[36113.544698]  65742f74 616c706d 00006574 00000000 00000000 00000000 00000000 00000000
[36113.544704]  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[36113.544709] Call Trace:
[36113.544714]  [] ? hacked_chdir+0x90/0x100 [GetModule]
[36113.544815]  [] ? tty_ldisc_deref+0xd/0x10
[36113.544818]  [] ? change_termios+0x195/0x2c0
[36113.544825]  [] ? _spin_lock+0xd/0x10
[36113.544879]  [] ? __d_lookup+0x102/0x110
[36113.544882]  [] ? dput+0x91/0x130
[36113.544919]  [] ? path_to_nameidata+0x1e/0x50
[36113.544922]  [] ? __link_path_walk+0x632/0xca0
[36113.544925]  [] ? copy_to_user+0x39/0x130
[36113.544928]  [] ? copy_termios+0x35/0x50
[36113.544931]  [] ? mntput_no_expire+0x1f/0xe0
[36113.544935]  [] ? syscall_call+0x7/0xb
[36113.544937] Code: fe ff ff 8d 85 f0 fd ff ff e8 c6 68 75 df 8b 5b 1c 85 db 75 a7 8d 85 f0 fd ff ff 31 db e8 62 6a 75 df 8d 95 f0 fd ff ff 8d 04 02  03 8b 85 e8 fd ff ff 8b 95 e8 fd ff ff 83 c0 01 89 85 ec fd 
[36113.544968] EIP: [] get_fullname+0xd7/0x1f0 [GetModule] SS:ESP 0068:dfb11b44
[36113.544971] CR2: 0000000000000000
[36113.544974] ---[ end trace 847fe2f82bcb0ca1 ]---


get_fullname是这么写的。。。
void get_fullname(const char *pathname,char *fullname)

{

struct dentry *tmp_dentry = current->fs->pwd.dentry;
char *p;

char tmp_path[MAX_LENGTH];

char local_path[MAX_LENGTH];

memset(tmp_path,0,MAX_LENGTH);

memset(local_path,0,MAX_LENGTH);



if (*pathname == '/') {

strcpy(fullname,pathname);

return;

}



while (tmp_dentry != NULL)

{

if (!strcmp(tmp_dentry->d_iname,"/"))

break;

strcpy(tmp_path,"/");

strcat(tmp_path,tmp_dentry->d_iname);

strcat(tmp_path,local_path);

strcpy(local_path,tmp_path);



tmp_dentry = tmp_dentry->d_parent;

}

// strcpy(fullname,local_path);

// strcat(fullname,"/");

// strcat(fullname,pathname);
*p = local_path + strlen(local_path);
while (1){
if ( *pathname++ == '.' && *pathname++ == '.' ){
if ( *pathname == '/' ){
pathname++; 
while( *p != '/' && p != NULL){
p--;
}
// p = rindex(local_path,'/');
memset(p,0,strlen(p));
} else { break; }
} else { break; }
}
strcpy(fullname,local_path);
strcat(fullname,"/");

strcat(fullname,pathname);

return;

}


不知道 怎么改 能正常

|
EIP is at get_fullname+0xd7/0x1f0 [GetModule]

这个地方出错了阿,根据这个你就可以定位错误在哪一行了阿,

用gcc -g 编译你的模块

然后gdb + 模块名

然后输入

info  line  *get_fullname+0xd7

就会提示你这个空指针的操作是在源码的哪一行了, 我猜你是没检查输入参数。

    
 
 

您可能感兴趣的文章:

  • 操作系统的系统函数
  • 如果忘了某个系统调用函数,比如只记得函数名的几个关键字,如何查?
  • 初学Unix,问:标准级函数,如fopen,fclose;系统级函数open,close,两者什么关系?(在一篇讲文件操作的文章中看到的)
  • 在unix系统中用什么函数可以判别操作系统类型和版本号??
  • Unix系统函数和C语言标准函数库有重叠的部分吗?
  • 望指点:系统调用与函数库关系
  • 高手帮帮忙!vi中如何实现跳转到任意结构体或函数的声明处,包括系统库中声明的函数和数据结构?
  • Linux添加系统调用时如何调用C语言库函数
  • C库函数和linux系统调用区别
  • 系统调用对应的内核函数在什么地方
  • Oracle 系统变量函数介绍
  • 如何链接系统库函数?!
  • C语言库函数strtod在不同系统上返回值格式不一致
  • 如何用man查看系统函数的帮助?
  • 浙ICP备11055608号-3 iis7站长之家
  • 怎么检查一个进程是否调用了系统函数呢?
  • 用哪些函数可以得到执行一个程序的系统CPU时间,用户CPU时间,时钟时间啊?
  • linux编程时候,要查询某个系统调用的库函数,如何查?
  • linux中为什么系统调用比普通函数调用更费时间?
  • linux的系统函数调用手册有没有电子档下载的?我找了半天都没找到
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • mount命令(linux操作系统)挂载卸载文件系统(cifs,光驱,nfs等)方法介绍
  • 问一个系统配置的问题:win2k系统能不能于SCO UNIX系统共存?
  • win7/Windows7系统下载地址搜集整理
  • unix下用java.util.Date取系统时间比直接在系统下用date命令查看系统时间早整整一个小时
  • Ubuntu查看系统信息命令介绍
  • windows 系统是否是多用户操作系统,如何理解“多用户操作系统”的“多用户”?
  • python下用os.execl执行centos下的系统时间同步命令ntpdate
  • 我现在想做一个权限管理系统,想让权限系统的利用性更强,我应该怎样设计权限系统呢.
  • 怎样重装win7系统?win7重装系统步骤详细图文介绍
  • 谁知道哪里有用java开发的管理信息系统软件(如:图书馆管理系统,人事部管理系统)的代码?
  • windows server2008上PowerBuilder程序系统错误解决方法
  • 原来已安装好ubuntu,因系统崩溃,重装WINXP系统,如何再次登录ubuntu系统?
  • Ubuntu系统安装及升级命令
  • Linux(Oracle系统在上面)系统无缘无故死机 , 可能是由于应用程序引起 , 可是由于重新启动查不到相关信息 , 不知道在哪里有记录系统CPU Lo
  • 安装运行微软win7/Windows7系统要求及官方下载地址
  • UNIX系统下,进程写文件,写了很大量的文件,但是进程被KILL -9杀掉,系统可以保证写缓冲上的文件写到系统吗?
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • LINUX系统怎么记录飞鱼星VE982G系统日志
  • Linux内存文件系统(ramdisk)的三种实现方式
  • pipe是什么样的文件系统?是独立的文件系统吗?
  • linux内存文件系统ramfs实现原理
  • MINIX3 系统如何添加系统调用


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3