V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
katsusan
V2EX  ›  Linux

Linux 下 c 程序的内存问题

  •  1
     
  •   katsusan · 2017-10-25 18:15:10 +08:00 via iPhone · 3136 次点击
    这是一个创建于 2592 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近碰到了个进程异常中止的问题,core 文件的 gdb 结果看来好像函数的代码区内存被滥用了,类似于如下
    (gdb) disass /mr Delete
    Dump of assembler code for function Delete():
    151 {
    →. 0x556ec6b0 <+0>:. 00. 00. add. %al,(%eax)
    0x556ec6b2 <+2>:. 00 00. add. %al,(%eax)
    ...
    }
    之后的值都是 0x00,统计了下前后总共有 4096 字节的代码区内存被置为 0x00,网上查了下没有提到关于代码转为机器码后的存放问题,是和静态变量它们放在一起还是单独的区域,求各位了解的大佬赐教>:-<
    11 条回复    2017-10-27 00:29:31 +08:00
    wevsty
        1
    wevsty  
       2017-10-25 18:23:45 +08:00
    这种情况一般是程序其他地方溢出覆盖了不该覆盖的地方导致的。
    katsusan
        2
    katsusan  
    OP
       2017-10-25 18:28:52 +08:00 via iPhone
    @wevsty 我原本也是这样想的,但是刚刚查资料提到说程序执行时的代码段区域是只读的,只读区域应该不能被覆盖吗吧
    katsusan
        3
    katsusan  
    OP
       2017-10-25 18:29:33 +08:00 via iPhone
    @katsusan 多了个“吗”
    katsusan
        4
    katsusan  
    OP
       2017-10-25 18:31:32 +08:00 via iPhone
    momocraft
        5
    momocraft  
       2017-10-25 18:42:01 +08:00
    Delete 是什麼
    katsusan
        6
    katsusan  
    OP
       2017-10-25 18:47:29 +08:00 via iPhone
    @momocraft 就是一个普通的函数,
    wevsty
        7
    wevsty  
       2017-10-25 19:06:04 +08:00   ❤️ 2
    @katsusan 事实是可以的。这部分所谓的只读意思是,告诉你不能修改,但是如果你硬要修改是有办法的。毕竟代码同样会被加载到内存上而内存本来就是可读写的。

    一般来说,下一条指令要执行的机器码错误多半是由于跳转的地址错误,调用函数实际上要执行 call 指令,而 call 指令是要把 IP ( X86 上是 EIP )寄存器存放到栈空间里的,如果函数里面错误的修改了栈空间里 IP ( EIP )的内容,那么在函数退出的时候 ret 指令就会把错误的值还原到 IP ( EIP ),这样你就会看到下一条执行的指令不正确了。
    所以一般来说类似 delete 这种函数执行的时候如果出现这样的问题,多半是因为栈空间进行了错误的写入。仔细检查是否有越界的情况产生。
    katsusan
        8
    katsusan  
    OP
       2017-10-25 19:42:21 +08:00 via iPhone
    @wevsty 好的,我再检查下,非常感谢
    NoAnyLove
        9
    NoAnyLove  
       2017-10-25 23:04:04 +08:00   ❤️ 1
    正常情况下,如果没有修改代码段的属性,对代码段进行写操作会产生 segmentation fault,除非进行了特殊操作,比如 mprotect
    katsusan
        10
    katsusan  
    OP
       2017-10-26 17:13:42 +08:00 via iPhone
    @NoAnyLove 哦哦,即使那段代码没执行到的话,修改也会产生 segmentation fault 的吗
    NoAnyLove
        11
    NoAnyLove  
       2017-10-27 00:29:31 +08:00
    @katsusan 不需要执行,在写的时候就会触发 segmentation fault
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2777 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:13 · PVG 10:13 · LAX 18:13 · JFK 21:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.