免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6313 | 回复: 9
打印 上一主题 下一主题

关于gdb这个工具 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-19 19:36 |只看该作者 |倒序浏览
如题,小弟一直使用“C/JAVA联合调试方法”用eclipse 和ndk-gdb工具一起调试android ndk程序,但是小弟发现个问题,就是ndk-gdb工具碰到错误的时候貌似没有类似 “保存栈” 的功能,每次报错都是类似 Program received signal SIGSEGV, Segmentation fault.,并不会明确到哪个类,哪个函数,哪一行,所以调试起来灰常不方便。
小弟想问,有没有方法能让我看到在程序崩溃时 它最后执行的那条语句,或者类似的方便调试的方法,请大侠们指点,小弟谢过先

(ndk-gdb 与 gdb 是一样的)

论坛徽章:
0
2 [报告]
发表于 2011-08-20 14:31 |只看该作者
回复 1# LinuxJoin

gdb 调试首先:
1. 在编译时,要用“gcc -g” 参数标识要生成与代码匹配的符号.

程序运行时出错,捕获出错位置, 可以用生成的core文件来定位:
2. 执行
  1. ulimit -c unlimited
复制代码
即可

生成core文件之后调试方法:
  1. gdb ./a.out core
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-08-22 10:44 |只看该作者
回复 2# bbxyard


    非常感谢您的回复,小弟对unix还不是很了解,
请问这个core文件该如何生成啊,请大侠指点,详细些就更好了,

论坛徽章:
0
4 [报告]
发表于 2011-08-22 22:26 |只看该作者
回复 3# LinuxJoin
我也菜鸟一个哈, 这些东东也就是多用用就熟悉啦.
生成core文件方法:
先执行一下以下命令,确保能生成core文件(试试就知道啦).
  1. ulimit -c unlimted
复制代码
然后你的程序运行挂掉之后,
应该会有这个提示:"Segmentation Fault (core dumped)"
在执行程序的目录下应该就有个"core"文件.(简单期间,你就在程序所在目录./a.out好啦, 这样core文件就是./core啦)

嗯,你先试试吧

论坛徽章:
0
5 [报告]
发表于 2011-08-29 11:08 |只看该作者
回复 4# bbxyard

“在执行程序的目录下应该就有个"core"文件”
非常感谢您的回复。


虽然小弟还没有找到 这个“执行程序的目录下” 但是 用“ulimit -c unlimted”命令后已经有点提示信息了。
小弟用的是cygwin,搞的是android ndk,可能跟您的有差别。所以小弟想问 如何在程序中 输出 当前程序执行的目录?
小弟上网搜寻未果

论坛徽章:
0
6 [报告]
发表于 2011-08-30 00:34 |只看该作者
回复 5# LinuxJoin
不好意思,应该是表达上的错误.
其实我就是指,当前工作目录啦.
比如:
你的工作目录是在:/tmp下
你的程序是: /opt/myapps/bin/a.out
你可以用绝对路径执行:/opt/myapps/bin/a.out
那么程序异常之后,生成的core文件就在: /tmp目录下.

最简单的情况下:
你在: /opt/myapps/bin下(即工作目录与程序所在目录一致)
执行:./a.out
那么core文件就在:/opt/myapps/bin下啦.

发现我表达确实有问题,说白了就是一句话:
生成的core文件,就在当前工作目录下,而不是执行程序所在的目录下.

论坛徽章:
0
7 [报告]
发表于 2011-08-30 15:24 |只看该作者
回复 6# bbxyard

thanks!
    您好,小弟最近在搞NDK的时候用arm-eabi-addr2line 命令的时候提示 “'a.out': No such file”

请问 这个 a.out是什么文件啊?

论坛徽章:
0
8 [报告]
发表于 2011-08-30 22:15 |只看该作者
本帖最后由 bbxyard 于 2011-08-30 22:21 编辑
回复  bbxyard

thanks!
    您好,小弟最近在搞NDK的时候用arm-eabi-addr2line 命令的时候提示 “'a.o ...
LinuxJoin 发表于 2011-08-30 15:24

用gcc编译,缺省输出的文件名就叫: a.out
你要先编译你的c程序.
刚才顺便看了你发的另外一个贴子. 你要是调试的话,只要用gcc加上“-g”参数 生成调试信息即可.
gcc -g ...
对了你是不是要自己编译“libc.so”啊?

论坛徽章:
0
9 [报告]
发表于 2011-08-31 10:59 |只看该作者
回复 8# bbxyard


    感谢您的回复,我不想自己生成libc.so,呵呵。
我有些明白了,明白该怎么问了,呵呵。
我的程序调用了一个动态链接库 mango_d.so ,而且我知道 程序崩溃是崩溃在这动态链接库里面,这时想要查找调用栈的信息与您上述的方法相同?
肯能是平台不一样吧,我这个不是在Linux下,所以用您的方法 触类旁通 的在我的环境下使用,终未果。。。。

thanks again for your reply sincerely

论坛徽章:
0
10 [报告]
发表于 2011-08-31 21:24 |只看该作者
回复 9# LinuxJoin


客气了哈.

cygwin模拟的Linux还是很逼真的.
在 cygwin中异常了,也是可以调试的.
只要你的模块是: mango_d.so 也是 gcc -g 出来的.
异常之后会有个: core文件的.(当然要unlimit -c unlimited了)

调试 core 文件即可.
祝好运
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP