PC6下载站

分类分类

使用GDB调试RB-tree的问题总汇

关注+2011-07-12作者:清晨

Content

1. at后面的一堆字符串代表什么?

2. 为什么没有单步进入(step in)_Rb_tree_insert_and_rebalance函数?

3. 如何通过目标文件.o或者可执行文件得知是否有debugging information?

4. 如何单步调试没有debugging information的函数?


0. 引子

上次写了使用GDB调试RB-tree的几个问题讨论了几个问题,但关于at后面字符串的讨论是错误的,特在此进行更正,希望不要误导读者。并向已经读过该文并被误导或有疑惑的读者致以诚挚的歉意,同时也谢谢这些读者对本blog的支持。

一点心得:虽然笔者讨论的问题并不是什么科学,只是简单的技术问题,但也应该本着实事求是的精神,改正自己的错误,对读者负责,实际上也是对自己负责。看来,“科学是严谨的”在技术问题上也是适用的,技术也应该严谨,也应该认真。

言归正传,首先更正这个错误。

1. at后面的一堆字符串代表什么?

at后面的一堆字符串是一个整体,并没有什么前半部分和后半部分。这个整体代表的是一个绝对路径。例如,

/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/new

其中的..表示当前目录的父目录。

因此,

/usr/lib/gcc/i386-redhat-linux/4.1.2/..表示/usr/lib/gcc/i386-redhat-linux

/usr/lib/gcc/i386-redhat-linux/4.1.2/../..表示/usr/lib/gcc

/usr/lib/gcc/i386-redhat-linux/4.1.2/../../..表示/usr/lib

/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../..表示/usr

因此,

/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/new

就是/usr/include/c++/4.1.2/new,是一个绝对路径。

其中,/usr/lib/gcc/i386-redhat-linux/4.1.2是在gcc-4.1.2安装时就确定的。

如果同时安装了多个版本的gcc,如下所示。

# ls /usr/lib/gcc/i486-linux-gnu

4.4  4.4.0  4.4.1

# ls /usr/include/c++

4.4  4.4.0  4.4.1

/usr/lib/gcc/i486-linux-gnu/4.4/../../../../include/c++/4.4/new

/usr/lib/gcc/i486-linux-gnu/4.4.0/../../../../include/c++/4.4.0/new

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../include/c++/4.4.1/new

2. 为什么没有单步进入(step in)_Rb_tree_insert_and_rebalance函数?

要回答这个问题,我们可以参考gdb的官方文档,如下。

Warning: If you use the step command while control is within a function that was compiled without debugging information, execution proceeds until control reaches a function that does have debugging information. Likewise, it will not step into a function which is compiled without debugging information. To step through functions without debugging information, use the stepi command, described below. (http://www.delorie.com/gnu/docs/gdb/gdb_38.html)

前半部分说明,如果在一个没有debugging information的函数中是用step命令,程序会一直运行到某个有debugging information的函数才停止。

另外,划线句子说明,如果某个函数没有debugging information,在使用step命令时不能进入该函数内部;那么这个命题的逆反命题也一定是成立的。即如果能step进入某个函数,则该函数一定有debugging information。

实际上,这也解释了使用GDB调试RB-tree的几个问题中的问题,即本标题的问题。

函数std::_Rb_tree, std::less, std::allocator >::_M_insert()在stl_tree.h中,有debugging information,而函数_Rb_tree_insert_and_rebalance所在的文件tree.cc在编译时被编译成tree.o并链接到动态库libstdc++.so,

展开全部

相关文章

更多+相同厂商

热门推荐

  • 最新排行
  • 最热排行
  • 评分最高
排行榜

    点击查看更多

      点击查看更多

        点击查看更多

        说两句网友评论

          我要评论...
          取消