gdb调试无法定位段错误 求救

翔云123456 2012-08-14 09:54:56



写了一段程序,总是出现段错误,于是gdb调试,结果无法找到段错误的位置。

gdb调试结果如下

[root@localhost udp_server4.9.3]# gcc -g -rdynamic -o server udp_server4.9.3.c
[root@localhost udp_server4.9.3]# gdb ./server
GNU gdb Red Hat Linux (6.5-15.fc6rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

(gdb) r
Starting program: /home/zyy/udp_socket/udp_server4.9.3/server


Program received signal SIGSEGV, Segmentation fault.
0x39313030 in ?? ()
(gdb) bt
#0 0x39313030 in ?? ()
#1 0x3839392e in ?? ()
#2 0x302c562c in ?? ()
#3 0x2e303030 in ?? ()
#4 0x30303030 in ?? ()
#5 0x302c4e2c in ?? ()
#6 0x30303030 in ?? ()
#7 0x3030302e in ?? ()
#8 0x2c452c30 in ?? ()
#9 0x30332c2c in ?? ()
#10 0x32323130 in ?? ()
#11 0x312a2c2c in ?? ()
#12 0x240a0d36 in ?? ()
#13 0x54565047 in ?? ()
#14 0x542c2c47 in ?? ()
#15 0x2c4d2c2c in ?? ()
#16 0x2c2c4e2c in ?? ()
#17 0x45342a4b in ?? ()
#18 0x47240a0d in ?? ()
#19 0x41474750 in ?? ()
#20 0x3030302c in ?? ()
#21 0x2e303230 in ?? ()
#22 0x2c383939 in ?? ()
---Type <return> to continue, or q <return> to quit---

关键位置全是问号,情何以堪?这可怎么看啊



代码有点长,先不帖了。

各位大侠指点。
...全文
819 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
翔云123456 2012-08-20
  • 打赏
  • 举报
回复
段错误定位到了,下一步就分析错误是如何造成的

结贴
hujianhuihappy_126 2012-08-20
  • 打赏
  • 举报
回复
以后推荐你用eclipse里德DEBUG进行调试,可以一直跟踪程序,非常直观的,感觉比较好用
忘世麒麟 2012-08-16
  • 打赏
  • 举报
回复
段错误说明内存的操作出现了问题.
可以使用printf语句在可以的地方输出某些不相关信息,确定执行到哪里程序就停止了.
当然假如会使用gdb调试的话设断点也是一个很实用的方法.
翔云123456 2012-08-16
  • 打赏
  • 举报
回复

通过设置断点,进行调试
最后确定段错误出现在data_deal()

调试过程和结果如下

(gdb)
data_deal (serfd=7, msg=0xbfd494a0 "") at udp_server4.9.3.c:251 正常

(gdb)
263 bzero(buf,sizeof(buf));
(gdb)
265 if (!read_datas(serfd,buf))
(gdb)
read_datas (fd=7, rcv_buf=0xbfd48c08 "") at udp_server4.9.3.c:191

(gdb) c
Continuing.


Program received signal SIGSEGV, Segmentation fault.
0x08049479 in data_deal (serfd=743320624,
msg=0x30303030 <Address 0x30303030 out of bounds>) at udp_server4.9.3.c:273
273 nread=strlen(buf);
(gdb)

从read_datas()返回data_deal()后,data_deal()参数就出问题了

这是什么问题,堆栈溢出?
JiMoKuangXiangQu 2012-08-15
  • 打赏
  • 举报
回复
1. 使能系统core dump;
2. 调试core dump.
赵4老师 2012-08-15
  • 打赏
  • 举报
回复
用watch命令设置变量值改变断点
Gonefar 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 1 楼 的回复:
你可以先设置断点,break main,然后单步调试step,这样能够知道哪一行出错。


现在的疑虑是,出现段错误的地方,一定是内存操作非法处,还是其他地方内存越界,运行到此处才出现呢?


程序刚开始运行正常,加了几个函数后,出现段错误,删除后又恢复正常,一定是这几个函数有问题?

通过printf()大体定位到运行到某个函数出现端错误,但是这个函数,……
[/Quote]
单步调试后,就知道哪一行出问题了,这样比知道哪几个函数有问题更有效。
加了几个函数出错,可能是添加的函数有问题,也可能是添加函数后导致其它函数出问题。
还是那句话,先精确定位错误啊!瞎猜没用的。
xunxun 2012-08-15
  • 打赏
  • 举报
回复
gcc -g3 -fno-omit-frame-pointer -rdynamic -o server udp_server4.9.3.c

再调试下看看


不行再把-g3换成-ggdb3


要不然就随便设置断点,run,直到第一个断点时段错误为止
nightkids_008 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 3 楼 的回复:
加输出缩小问题范围


试过,大体确定方位
担心的是
出现段错误的地方,一定是内存操作非法处,还是其他地方内存越界,运行到此处才出现呢?
[/Quote]
光担心有啥用?试试才知道
翔云123456 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
加输出缩小问题范围
[/Quote]

试过,大体确定方位
担心的是
出现段错误的地方,一定是内存操作非法处,还是其他地方内存越界,运行到此处才出现呢?
翔云123456 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
你可以先设置断点,break main,然后单步调试step,这样能够知道哪一行出错。
[/Quote]

现在的疑虑是,出现段错误的地方,一定是内存操作非法处,还是其他地方内存越界,运行到此处才出现呢?


程序刚开始运行正常,加了几个函数后,出现段错误,删除后又恢复正常,一定是这几个函数有问题?

通过printf()大体定位到运行到某个函数出现端错误,但是这个函数,跟加入的几个函数一点关系都没有。

nice_cxf 2012-08-15
  • 打赏
  • 举报
回复
加输出缩小问题范围
woainixiong520 2012-08-15
  • 打赏
  • 举报
回复
这个段错误一般不好调试哦,建议你先run一下,看看段错误大概停在什么地方,然后再看看逻辑是不是出错了,或者内存出现了问题呢等。
Gonefar 2012-08-15
  • 打赏
  • 举报
回复
你可以先设置断点,break main,然后单步调试step,这样能够知道哪一行出错。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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