在我为gdb安装了那些丢失的调试信息包之后,我可以做什么不同的事情?
我有一个新安装在我为gdb安装了那些丢失的调试信息包之后,我可以做什么不同的事情?,gdb,Gdb,我有一个新安装CentOS Linux 7.2.1511版(核心版),而gdbverison是GNU gdb(gdb)Red Hat Enterprise Linux 7.6.1-119.el7 我看到了丢失的单独debuginfos警告 Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.
CentOS Linux 7.2.1511版(核心版)
,而gdb
verison是GNU gdb(gdb)Red Hat Enterprise Linux 7.6.1-119.el7
我看到了丢失的单独debuginfos警告
Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64
我了解到:
缺少glibc-2.17-157.el7_3.1.x86_64
只会阻止您通过glibc
本身
根据这个答案
现在我已经成功地安装了所有这些调试信息包。但我看不出有什么不同。安装了这些额外的软件包后,我现在可以做什么
以C++程序为例:
#包括
#包括
#包括
使用名称空间std;
int main(){
向量a={1,2,3};
向量b={4,5,6};
映射m={1,a},{2,b};
库特
那么有什么区别呢
不同之处在于,您现在可以列出GLIBC的源代码(这与libstdc++
不同)并逐步遍历它们
尝试使用和不使用debuginfo安装的(gdb)列表中止
更新:
我能在没有这些包的情况下“列出libstdc++的soucre”和“逐步完成它们”吗
libstdc++
与GLIBC的不同之处在于,它的大部分功能是由模板提供的,模板包含在您自己的源代码中。当您逐步完成例如/usr/include/c++/4.8.2/bits/stl_map.h
时,这正是发生的事情
但是,您可能仍然需要debuginfo安装libstdc++-4.8.5-44.el7.x86_64
,以便能够列出并单步执行libstdc++
中不属于所提供标头的部分
IIRC,std::basic_string的实现和std::basic_ios的各个部分都属于这一类。您可以运行nm-C libstdc++.so.6 | egrep'[TW].
来查看这些符号的列表
更新2:
那些安装的调试信息只是glibc和gcc源文本文件吗
没有
调试信息是一组文件,允许调试器将库的.text
中的特定偏移量与在该偏移量处生成机器代码的源代码相关联。它还对参数和变量的类型、给定函数中局部变量的位置等进行编码。您可以阅读有关调试信息的更多信息
在某些系统上,调试信息包还包括库的源代码,但这在Linux系统中并不通用,并且不是调试信息包的主要用途(如果您只需要源代码,可以安装源代码包)。多亏@Employed俄语的回答,现在我知道了确切的区别
下面是我从2个新安装的CentOS 7.2中观察到的情况,一个安装了调试信息,另一个没有
操作系统版本:CentOS Linux 7.2.1511版(核心版)
GDB版本:GNU GDB(GDB)Red Hat Enterprise Linux 7.6.1-119.el7
测试程序:
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
字符串s=“123”;
向量a={1,2,3};
向量b={4,5,6};
映射m={1,a},{2,b};
没问题。我要在我的VPS上安装一个新的CentOS 7.2,然后试试你说的。但是请允许我提前问一个问题,所以安装debuginfo软件包就是让我列出GLIBC的源代码并逐步检查它们。那么为什么要我安装debuginfo install libstdc++-4.8.5-44.el7.x86_64
,这与相关呢>c++
?我能在没有这些包的情况下“列出libstdc++的源代码”和“逐步完成它们”吗?(如我的问题所示,当我看到我在stl\u map.h
中时,这意味着我可以逐步完成libstdc++
对吗?对不起,我不是很确定。))谢谢你提供的额外信息。检查我的答案,看看我是否有什么错误。:P再次感谢你!那些安装的调试信息只是glibc和gcc源文本文件吗?我在玩一些带有g++
,-g
设置的测试程序,而现在我感觉从debuginfo安装
安装的是仅源文本文件.c
@Rick我再次更新了答案。在阅读了您回答的这个问题后,我了解了详细信息。我还了解了单独的调试信息文件是如何工作的,并尝试手动重定向gdb
,以查找具有设置替换路径
的源文件。
std::map<int, std::vector<int, std::allocator<int> >, std::less<int>, std::allocator<std::pair<int const, std::vector<int, std::allocator<int> > > > >::operator[](int&&) (this=0x7fffffffe3f0,
__k=<unknown type in /root/a.out, CU 0x0, DIE 0x7b70>) at /usr/include/c++/4.8.2/bits/stl_map.h:481
481 iterator __i = lower_bound(__k);
debuginfo-install glibc-2.17-307.el7.1.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64
========================================================================================================================
Package Arch Version Repository Size
========================================================================================================================
Installing:
gcc-debuginfo x86_64 4.8.5-44.el7 debuginfo 195 M
glibc-debuginfo x86_64 2.17-307.el7.1 debuginfo 9.5 M
nss-softokn-debuginfo x86_64 3.44.0-8.el7_7 debuginfo 2.1 M
yum-plugin-auto-update-debug-info noarch 1.1.31-54.el7_8 os 29 k
Installing for dependencies:
gcc-base-debuginfo x86_64 4.8.5-44.el7 debuginfo 2.9 M
glibc-debuginfo-common x86_64 2.17-307.el7.1 debuginfo 9.7 M
Breakpoint 1, main () at test.cpp:10
10 string s = "123";
(gdb) s
std::allocator<char>::allocator (this=0x7fffffffe45b)
at /usr/src/debug/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/allocator.h:113
113 allocator() throw() { }
(gdb) s
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (this=0x7fffffffe450,
__s=0x403b73 "123", __a=...)
at /usr/src/debug/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.tcc:212
212 basic_string<_CharT, _Traits, _Alloc>::
(gdb) s
16 cout << s << endl;
(gdb) n
123
17 abort();
(gdb) s
__GI_abort () at abort.c:52
52 {
(gdb) list
47
48
49 /* Cause an abnormal program termination with core-dump. */
50 void
51 abort (void)
52 {
53 struct sigaction act;
54 sigset_t sigs;
55
56 /* First acquire the lock. */