GDB 打印的堆栈信息只有malloc_consolidate () 看不见别的,请指教!

Yesterdeng 2007-09-06 04:14:18
问题是这样的,有一个较大的程序,在suse linux上运行一段时间之后coredump,core了之后用gdb查看信息如下:
Program terminated with signal 11, Segmentation fault.

warning: current_sos: Can't read pathname for load map: Input/output error

Reading symbols from /lib/tls/libpthread.so.0...done.
Loaded symbols for /lib/tls/libpthread.so.0
Reading symbols from /lib/libdl.so.2...done.
Loaded symbols for /lib/libdl.so.2
Reading symbols from /lib/tls/librt.so.1...done.
Loaded symbols for /lib/tls/librt.so.1
Reading symbols from /usr/lib/libstdc++.so.5...done.
Loaded symbols for /usr/lib/libstdc++.so.5
Reading symbols from /lib/tls/libm.so.6...done.
Loaded symbols for /lib/tls/libm.so.6
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /lib/libnss_files.so.2...done.
Loaded symbols for /lib/libnss_files.so.2
#0 0x401889b5 in malloc_consolidate () from /lib/tls/libc.so.6
(gdb) where
#0 0x401889b5 in malloc_consolidate () from /lib/tls/libc.so.6
#1 0x00000000 in ?? ()
(gdb) q

就只有这么寥寥几行,关键是看不出来是在程序的哪里core掉,程序很大没办法一点点查。
麻烦大牛们帮帮忙,多谢了!
...全文
3566 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
q1wenchang 2012-02-07
  • 打赏
  • 举报
回复
我也遇到这种问题了,不知道怎么解决是好
lipps 2011-06-22
  • 打赏
  • 举报
回复
封装一下malloc/free,增加打印信息, 在哪一行,然后在malloc/free的调用时候的.

或者用valgrind等工具检查内存方面存在的问题
Yesterdeng 2007-09-12
  • 打赏
  • 举报
回复
通过寄存器的内容怎么找到程序当前运行指令和数据呢?
Yesterdeng 2007-09-12
  • 打赏
  • 举报
回复
因为不知道程序在哪里崩溃的,所以没法设断点,gdb的bt命令就能看到那两行,虽然知道了是内存越界,却怎么也找不到哪里越界啊
dai_weitao 2007-09-12
  • 打赏
  • 举报
回复
这个具体调试工作凭借你的程序经验检查吧, 我相信自己写的程序或者读过点程序的程序员都可以看出来.
dai_weitao 2007-09-11
  • 打赏
  • 举报
回复
要查看寄存器的值,很简单,可以使用如下命令:

info registers
查看寄存器的情况。(除了浮点寄存器)

info all-registers
查看所有寄存器的情况。(包括浮点寄存器)

info registers
查看所指定的寄存器的情况。

寄存器中放置了程序运行时的数据,比如程序当前运行的指令地址(ip),程序的当前堆栈地址(sp)等等。你同样可以使用print命令来访问寄存器的情况,只需要在寄存器名字前加一个$符号就可以了。如:p $eip。
dai_weitao 2007-09-11
  • 打赏
  • 举报
回复
gdb不能跟吗?
Yesterdeng 2007-09-07
  • 打赏
  • 举报
回复
能不能详细解释一下啊?
Yesterdeng 2007-09-07
  • 打赏
  • 举报
回复
如何查看%esp?
Yesterdeng 2007-09-07
  • 打赏
  • 举报
回复
多谢各位,有没有办法查到是哪里越界呢?
dai_weitao 2007-09-06
  • 打赏
  • 举报
回复
没别的毛病, 就是局部变量防卫越界, 因为#1 0x00000000 in ?? ()
说明栈溢出了, 无法通过GDB显示, 可以查看%esp.
有几种可能:循环赋值语句, memcpy memset等等, 也可能是数组越界.
hefuhua 2007-09-06
  • 打赏
  • 举报
回复
查看与malloc有关的代码,主要看malloc与free要成对使用和对malloc分配的地址习惯性的
检查
dai_weitao 2007-09-06
  • 打赏
  • 举报
回复
很明显啊, malloc_consolidate().
这个调用是malloc/free的时候调用的.

#1 0x00000000 in ?? ()
===========================
这行表明很有可能是局部变量越界. 在这之后malloc或free了, 所以导致core dump.

23,216

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧