Chinaunix

标题: 请问我这个C++程序怎么不能用gdb罗列代码? [打印本页]

作者: kytexzy    时间: 2009-09-08 18:06
标题: 请问我这个C++程序怎么不能用gdb罗列代码?
我找了一个boost的聊天服务器的例子,想用gdb调试,我用CMake设置为debug模式,可是当我
gdb -p xxx
时,显示:
Attaching to process 8003
Reading symbols from /home/zhen/works/c++/boost/asio/chat/build/server...done.
Reading symbols from /usr/lib/libboost_system-mt.so.1.38.0...Reading symbols from /usr/lib/debug/usr/lib/libboost_system-mt.so.1.38.0...done.
done.
Loaded symbols for /usr/lib/libboost_system-mt.so.1.38.0
Reading symbols from /usr/lib/libstdc++.so.6...done.
Loaded symbols for /usr/lib/libstdc++.so.6
Reading symbols from /lib/libm.so.6...Reading symbols from /usr/lib/debug/lib/libm-2.9.so...done.
done.
Loaded symbols for /lib/libm.so.6
Reading symbols from /lib/libgcc_s.so.1...Reading symbols from /usr/lib/debug/lib/libgcc_s.so.1...done.
done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.6...Reading symbols from /usr/lib/debug/lib/libc-2.9.so...done.
done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libpthread.so.0...Reading symbols from /usr/lib/debug/lib/libpthread-2.9.so...done.
[Thread debugging using libthread_db enabled]
done.
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/librt.so.1...Reading symbols from /usr/lib/debug/lib/librt-2.9.so...done.
done.
Loaded symbols for /lib/librt.so.1
Reading symbols from /lib/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug/lib/ld-2.9.so...done.
done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x00007fb24a9d8bb3 in __epoll_wait_nocancel () from /lib/libc.so.6
(gdb) list
1       fstab.c: 没有那个文件或目录.
        in fstab.c
(gdb)

请问我这问题在哪呢?

我用的系统: Debian @ amd64。


作者: prolj    时间: 2009-09-08 18:12
gdb本来支持C++就不咋的
=================================
没事扯CMake干啥?

[ 本帖最后由 prolj 于 2009-9-8 18:31 编辑 ]
作者: syncpk99    时间: 2009-09-08 18:29
fstab.c 是你自己的源代码么?
怎么感觉是linux自己的库文件中使用的代码呢。如果是linux的代码,要想list,就必须装linux的源代码才行啊。
作者: kytexzy    时间: 2009-09-08 18:33
我是在学习boost::asio,需要用到libboost_system,因为要用到epoll,估计是需要进行系统调用吧!
但是这个fstab.c我就是不知道是哪个国家来的。

怎么才能让gdb支持它喔!



[ 本帖最后由 kytexzy 于 2009-9-8 18:35 编辑 ]
作者: prolj    时间: 2009-09-08 18:35
fatab.c应该是来自Linux
作者: kytexzy    时间: 2009-09-08 18:42
请哪位教教怎么用gdb 调试C++ asio库相关的代码。
作者: syncpk99    时间: 2009-09-08 18:53
和调试C代码没什么两样啊。
可以参考下面的网页啊
http://bbs.chinaunix.net/viewthread.php?tid=1430107
作者: drangon    时间: 2009-09-08 20:04
你应该先执行 backtrace 命令,看一下堆栈,甚至 info threads,看看是哪个线程,然后选合适的线程的某个合适的frame进行查看。

你的程序会调用到glibc里面的东西,而glibc一般是没有debug信息的,除非你用带debug的glibc。这个fstab.c有可能是glibc里面的东东
作者: kytexzy    时间: 2009-09-09 10:53
原帖由 drangon 于 2009-9-8 20:04 发表
你应该先执行 backtrace 命令,看一下堆栈,甚至 info threads,看看是哪个线程,然后选合适的线程的某个合适的frame进行查看。

你的程序会调用到glibc里面的东西,而glibc一般是没有debug信息的,除非你用带 ...


这样子的话我怎样在gdb中浏览程序的代码呢?我又设置程序的断点呢?


作者: kytexzy    时间: 2009-09-09 17:06
asio的服务端程序Linux下用什么方法调试比较好?好像std::cout也打印不出来消息!不过用std::cerr可以!
但用print来调试也太低级了吧!我这个新手不大懂。



[ 本帖最后由 kytexzy 于 2009-9-9 17:29 编辑 ]
作者: drangon    时间: 2009-09-09 20:35
标题: 回复 #9 kytexzy 的帖子
你要浏览什么地方就直接浏览好了,例如退回高一点的你的代码所在的frame,或者直接列出某个文件的某一行,
设断点也一样,直接设在函数名上,或者某个文件某一行上好了。
作者: drangon    时间: 2009-09-09 20:40
标题: 回复 #10 kytexzy 的帖子
不要认为print低级,一般调试到后面,很少会单步跟踪的,都是靠日志的。

打日志最好定好原则,什么情况下打什么日志约定好,简洁一些,同时多输出一些原始数据供参考。

一般简单的bug,通过单元测试,把所有路径都覆盖一下,基本都能解决。
复杂的bug,有时候几天才出现一次,这时候单步跟踪很累的。通常预先在关键点打日志,
根据输出的原始数据,想象模拟还原系统当时的情况,分析可能出问题的地方,必要时再增加日志。
作者: kytexzy    时间: 2009-09-17 22:26
gdb可以调试boost的多线程程序,但是asio就是不能用list来罗列代码,不能用list就不好设断点,这是最要命的东西!


作者: kytexzy    时间: 2009-09-18 09:42
终于找到问题,原来是我的CMake配置文件书写得有点问题,用ccmake重新配置后就好啦!







欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2