免费注册 查看新帖 |

Chinaunix

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

[C] 如何使用gdb定位到具体代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-10 17:09 |只看该作者 |倒序浏览
使用gdb 提示如下:
Program received signal SIGSEGV, Segmentation fault.
[Switching to thread 2164.0xb9c]
0x71a22ef5 in _libws2_32_a_iname ()

应该就是段错误,是不是调用ws2的时候发生了错误呢?
gdb不提示哪行错了啊?!
郁闷

论坛徽章:
0
2 [报告]
发表于 2009-03-10 17:24 |只看该作者
提示这种错误一般是你使用这个库的地方参数传错了,也不需要定位到这个库里面去看代码,你info stack看看调用堆栈,然后就知道是你自己哪个函数出了问题。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2009-03-10 18:02 |只看该作者
gdb调试的时候,可以先
b main
run,
然后一步一步调试,或者在设置断点啊。

论坛徽章:
0
4 [报告]
发表于 2009-03-10 20:01 |只看该作者
where看看

论坛徽章:
0
5 [报告]
发表于 2009-03-11 09:52 |只看该作者
Program received signal SIGSEGV, Segmentation fault.
[Switching to thread 1100.0x670]
0x77e8078a in _libws2_32_a_iname ()
(gdb) info stack
#0  0x77e8078a in _libws2_32_a_iname ()
#1  0x60fd7248 in _libws2_32_a_iname ()
#2  0x0130fc3c in ?? ()
#3  0x77ed460b in _libws2_32_a_iname ()
#4  0x61000c48 in _libws2_32_a_iname ()
#5  0x60ffafa9 in _libws2_32_a_iname ()
#6  0x719c77d2 in _libws2_32_a_iname ()
#7  0x71a28d16 in _libws2_32_a_iname ()
#8  0x0040317c in open_socket (port=80 at sock.c:51
#9  0x00402f75 in start_server () at server.c:31
#10 0x77c0a243 in _libws2_32_a_iname ()
#11 0x7c80b713 in _libws2_32_a_iname ()


open_socket (port=80 at sock.c:51代码为:
    if (listen(fd, 10) != 0)

有错吗?

论坛徽章:
0
6 [报告]
发表于 2009-03-11 10:18 |只看该作者

回复 #5 hbbdren 的帖子

Program received signal SIGSEGV, Segmentation fault.
[Switching to thread 1100.0x670]
0x77e8078a in _libws2_32_a_iname ()
(gdb) info stack
#0  0x77e8078a in _libws2_32_a_iname ()
#1  0x60fd7248 in _libws2_32_a_iname ()
#2  0x0130fc3c in ?? ()<<<<问题应该出在这儿。查查 要是搞不清楚,先用file 加载你的可执行文件,然后再看看,它是多少行。这种以0x0打头的是有用信息。第一行是出问题的行。一般小弟都这么查。
#3  0x77ed460b in _libws2_32_a_iname ()
#4  0x61000c48 in _libws2_32_a_iname ()
#5  0x60ffafa9 in _libws2_32_a_iname ()
#6  0x719c77d2 in _libws2_32_a_iname ()
#7  0x71a28d16 in _libws2_32_a_iname ()
#8  0x0040317c in open_socket (port=80 at sock.c:51
#9  0x00402f75 in start_server () at server.c:31
#10 0x77c0a243 in _libws2_32_a_iname ()
#11 0x7c80b713 in _libws2_32_a_iname ()

论坛徽章:
0
7 [报告]
发表于 2009-03-11 13:37 |只看该作者

回复 #6 urapple 的帖子

#2  0x0130fc3c in ?? ()<<<<问题应该出在这儿。查查 要是搞不清楚,先用file 加载你的可执行文件,然后再看看,它是多少行。这种以0x0打头的是有用信息。第一行是出问题的行。一般小弟都这么查。


如何查这是哪里啊?

论坛徽章:
0
8 [报告]
发表于 2009-03-11 14:18 |只看该作者

回复 #7 hbbdren 的帖子

(gdb) file 你的可执行文件
先试试,应该就可以显示行号
#2  0x0130fc3c in ?? ()《《后面会出现行号。实在不行,再重新编译,加几个参数,生成map文件查。
先试试吧

论坛徽章:
0
9 [报告]
发表于 2009-03-11 14:23 |只看该作者
#2  0x0130fc3c in ?? ()《《后面会出现行号。

后面就是??,没有行号

论坛徽章:
0
10 [报告]
发表于 2009-03-11 14:52 |只看该作者

回复 #9 hbbdren 的帖子

编译的时候加
-Wa,-a,-ad
比如
CFLAGS=  -c -I$(INCLUDE) -I. -Wall -Wa,-a,-ad
COMPILE=$(CC) $(CFLAGS)
$(COMPILE) -g $< -o $@ >>test.cod

连接的时候加
-Wl,-Map
比如
-Wl,-Map
$(CC)  -o $@ $(OBJS)  $(LFLAGS) -static -Wl,-Map,test.map
-static是申明静态,gcc默认动态。
如果你刚才没有,就别加了。
然后从test.map里找到离0x0130fc3c最近的一个数,并且比他小的。然后看看那个数对应的函数是什么
然后从test.cod里找到这个函数
用0x0130fc3c减去那个函数的起始地址,就是出问题代码的偏移。
要是还不行我也没招。
要是容易复现,就加上-static选项重编译一下。
然后再出问题就不会出一大堆乱七八糟的东西了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP