【发布时间】:2011-05-25 05:32:01
【问题描述】:
我的应用程序发生了严重的崩溃。 GDB 总是回溯到__kernel_vsyscall()。调试后在源代码中没有发现任何可疑之处。
但在 GCC 编译器中随机禁用一次“-O3”优化标志似乎可以解决问题。我不确定这是否是崩溃的原因,或者编译器是否在优化过程中做了一些讨厌的事情。任何评论或信息都会有所帮助。
在下面显示的一些回溯中,在应用程序代码中观察到的唯一错误是从 MsgQ (buffLen) 接收到的缓冲区的长度。但源代码确保通过 MsgQ 发送和接收的消息的最大大小为 2048 字节。无法追踪 msgrcv() 调用返回的长度为何以及何时损坏。
崩溃 1:
- 0x00110416 in __kernel_vsyscall()
- 0x00352391 in send() from /lib/libc.so.6
- /lib/libc.so.6 中的 __vsyslog_chk () 中的 0x0034d31c
- 0x0034d5b7 in syslog () from /lib/libc.so.6
- procType1Msg 中的 0x0804f08f(MsgBuff=0xbfc10275)
- procRcvdMsQBuf 中的 0x080498c5(buffLen=134515184,buff='值优化出来')
- 主要(argc=3,argv=0xbfc10b24)
崩溃 2:
- 0x00110416 in __kernel_vsyscall()
- 0x00352391 in send() from /lib/libc.so.6
- /lib/libc.so.6 中的 __vsyslog_chk () 中的 0x0034d31c
- 0x0034d5b7 in syslog () from /lib/libc.so.6
- dumpMsg 中的 0x0806234b (buff=0xbfe01832 "U\006\" x,¨n,#®U\027\bI@\024",len=23)
- procType1Msg 中的 0x0804e539(MsgBuff=0xbfe01815)
- procRcvdMsQBuf 中的 0x0804956d(buffLen=134515040,buff='值优化出来')
- main (argc=3, argv=0xbfe020c4)
崩溃 3:
- 0x00110416 in __kernel_vsyscall()
- 0x00353e3f in msgrcv () from /lib/libc.so.6
- getMsgQBuffer 中的 0x080639b9(msg_id=196611, pMsg=0xbfa9d360, lMsgType=0, piErrorNo=0xbfa9d35c)
- 0x080497dd in main(argc=无法访问地址 0x30003 处的内存)
【问题讨论】:
-
使用
-O2会发生什么?
标签: linux gcc system-calls