gpt4 book ai didi

linux - 禁用 GCC 优化后不会发生 __kernel_vsyscall() 崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:52 24 4
gpt4 key购买 nike

我的应用程序发生了严重的崩溃。 GDB 总是回溯到 __kernel_vsyscall()。调试后在源代码中没有发现任何可疑的地方。

但在 GCC 编译器中随机禁用一次“-O3”优化标志似乎可以解决问题。我不确定这是否是崩溃的原因,或者编译器是否在优化过程中做了一些令人讨厌的事情。任何评论或信息都会有所帮助。

在下面显示的一些回溯中,在应用程序代码中观察到的唯一错误是从 MsgQ (buffLen) 接收到的缓冲区的长度。但是源代码确保通过 MsgQ 发送和接收的消息的最大大小为 2048 字节。无法追踪 msgrcv() 调用返回的长度可能损坏的原因和时间。

崩溃 1:

  1. __kernel_vsyscall () 中的 0x00110416
  2. 0x00352391 in send () from/lib/libc.so.6
  3. 来自/lib/libc.so.6 的 __vsyslog_chk () 中的 0x0034d31c
  4. 来自/lib/libc.so.6 的 syslog () 中的 0x0034d5b7
  5. procType1Msg 中的 0x0804f08f(MsgBuff=0xbfc10275)
  6. procRcvdMsQBuf 中的 0x080498c5(buffLen=134515184,buff='value optimized out')
  7. 主要(argc=3,argv=0xbfc10b24)

崩溃 2:

  1. __kernel_vsyscall () 中的 0x00110416
  2. 0x00352391 in send () from/lib/libc.so.6
  3. 来自/lib/libc.so.6 的 __vsyslog_chk () 中的 0x0034d31c
  4. 来自/lib/libc.so.6 的 syslog () 中的 0x0034d5b7
  5. dumpMsg 中的 0x0806234b (buff=0xbfe01832 "U\006\"x,¨n,#®U\027\bI@\024",len=23)
  6. procType1Msg 中的 0x0804e539(MsgBuff=0xbfe01815)
  7. procRcvdMsQBuf 中的 0x0804956d(buffLen=134515040,buff='value optimized out')
  8. 主要(argc=3,argv=0xbfe020c4)

崩溃 3:

  1. __kernel_vsyscall () 中的 0x00110416
  2. 来自/lib/libc.so.6 的 msgrcv () 中的 0x00353e3f
  3. getMsgQBuffer 中的 0x080639b9(msg_id=196611,pMsg=0xbfa9d360,lMsgType=0,piErrorNo=0xbfa9d35c)
  4. main 中的 0x080497dd(argc=无法访问地址 0x30003 处的内存)

最佳答案

我的猜测是您的代码某处存在内存损坏(可能是缓冲区溢出)。

当您使用 3 级优化进行编译时,编译器输出的代码会导致缓冲区溢出覆盖一些重要的内容(可能会损坏堆栈?),并且碰巧编译器在没有优化的情况下运行时会生成未优化的代码标志不同,因此溢出会覆盖其他内容并且不会导致此特定症状。错误可能仍然存在,它可能会以其他方式表现出来,甚至根本不会表现出来 - 直到你更改一些不相关的东西,然后它会再次咬你。

__kernel_vsyscall() 只是一个 glibc 函数,每当您执行系统调用时都会在内部调用它。那里没有什么重要的。

我的建议:在 valgrind 下运行你的程序。它很可能会为您发现内存溢出。

关于linux - 禁用 GCC 优化后不会发生 __kernel_vsyscall() 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6119938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com