您的位置:首页技术开发java教程 → 使用GDB调试RB-tree的问题总汇

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

时间:2011/7/12 8:20:15来源:本站原创作者:清晨我要评论(1)

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,

相关视频

    没有数据

相关阅读 使用时间倒流功能,每消除1个可以增加几秒时间? 天天爱消除2月1H1Z1熔炉怎么点燃 H1Z1熔炉制作及使用方法龙之谷手游怎么用电脑玩 龙之谷手游电脑版使用教程三国志13威力加强版破解了吗 三国志13威力加强版破解补丁使用方法美团打车怎样加入 美团打车怎么使用命运冠位指定圣晶石怎么使用 FGO圣晶石使用方法仁王枪加点攻略 仁王枪使用心得技巧小米直供模式怎么使用 小米直供使用方法介绍

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 myeclipse如何安装插件myeclipse怎么显示代码 myeclipse怎么连接到数据库 myeclipse连接到eclipse没有maven选项怎么办 eclipse没有majava设置cookie教程 java怎么设置cookiejava怎么设置随机数 java设置随机数详细教程

人气排行 java.lang.NullPointerException错误处理方eclipse没有maven选项怎么办 eclipse没有majava环境变量配置方法java中String类主要方法的使用java中创建并初始化字符串方法MyEclipse的注册以及汉化方法图解myeclipse如何安装插件 myeclipse安装插件方一个简单Java发邮件源代码