为什么';gdb-s选项是否加载符号文件?

为什么';gdb-s选项是否加载符号文件?,gdb,Gdb,我正在尝试创建一个核心转储,并使用gdb对其进行分析。这是我为创建核心转储而编写的代码 #include <iostream> void bar() { char *p = (char *) 123; std::cout << "bar start\n"; std::cout << *p << "\n"; std::cout << "bar end\n"; } void foo() { std

我正在尝试创建一个核心转储,并使用gdb对其进行分析。这是我为创建核心转储而编写的代码

#include <iostream>

void bar()
{
    char *p = (char *) 123;
    std::cout << "bar start\n";
    std::cout << *p << "\n";
    std::cout << "bar end\n";
}

void foo()
{
    std::cout << "foo start\n";
    bar();
    std::cout << "foo end\n";
}

int main()
{
    foo();
}
运行
make
/foo
后,我的目录就是这样的

# ls
core.28091  foo  foo.cc  foo.dbg  Makefile
我能够像这样分析堆芯转储。我通过将可执行文件和核心文件指定为命令行参数来启动gdb。然后使用
符号文件foo.dbg
命令从foo.dbg加载符号

[root@centos crash]# gdb foo core.28091
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/lab/crash/foo...(no debugging symbols found)...done.
[New Thread 28091]
Missing separate debuginfo for
Try: yum --disablerepo='*' --enablerepo='*-debug*' install /usr/lib/debug/.build-id/81/a81be2e44c93640adedb62adc93a47f4a09dd1
Reading symbols from /usr/lib64/libstdc++.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib64/libstdc++.so.6
Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libgcc_s.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libgcc_s.so.1
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Core was generated by `./foo'.
Program terminated with signal 11, Segmentation fault.
#0  0x000000000040076f in bar() ()
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.x86_64 libgcc-4.4.7-4.el6.x86_64 libstdc++-4.4.7-4.el6.x86_64
(gdb) symbol-file foo.dbg
Reading symbols from /root/lab/crash/foo.dbg...done.
(gdb) bt
#0  0x000000000040076f in bar () at foo.cc:8
#1  0x00000000004007b7 in foo () at foo.cc:15
#2  0x00000000004007d1 in main () at foo.cc:21
(gdb) list
12      void foo()
13      {
14          std::cout << "foo start\n";
15          bar();
16          std::cout << "foo end\n";
17      }
18
19      int main()
20      {
21          foo();
(gdb)
[root@centos崩溃]#gdb foo core.28091
GNU gdb(gdb)Red Hat Enterprise Linux(7.2-60.el6_4.1)
版权所有(C)2010免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“x86_64-redhat-linux-gnu”。
有关错误报告说明,请参阅:
...
正在从/root/lab/crash/foo…读取符号(未找到调试符号)…完成。
[新线程28091]
缺少的单独debuginfo
Try:yum--disablerepo='*'--enablerepo='*-debug*'安装/usr/lib/debug/.build id/81/a81be44c93640adedb62adc93a47f4a09dd1
正在从/usr/lib64/libstdc++.so.6读取符号…(未找到调试符号)…已完成。
为/usr/lib64/libstdc++.so.6加载的符号
正在从/lib64/libm.so.6读取符号…(未找到调试符号)…已完成。
为/lib64/libm.so.6加载的符号
正在从/lib64/libgcc_.s.so.1读取符号…(未找到调试符号)…已完成。
为/lib64/libgcc_.so.1加载的符号
正在从/lib64/libc.so.6读取符号…(未找到调试符号)…已完成。
为/lib64/libc.so.6加载的符号
正在从/lib64/ld-linux-x86-64.so.2…读取符号(未找到调试符号)…完成。
为/lib64/ld-linux-x86-64.so.2加载的符号
核心由“./foo”生成。
程序以信号11终止,分段故障。
#条形图()中的0 0x000000000040076f()
缺少单独的调试信息,请使用:debuginfo安装glibc-2.12-1.132.el6.x86_64 libgcc-4.4.7-4.el6.x86_64 libstdc++-4.4.7-4.el6.x86_64
(gdb)符号文件foo.dbg
从/root/lab/crash/foo.dbg读取符号…完成。
(gdb)英国电信
#在foo.cc:8处的条()中0 0x000000000040076f
#foo()中的0x00000000004007b7位于foo.cc:15
#foo.cc:21处的main()中有2个0x00000000004007d1
(gdb)清单
12 void foo()
13      {

14 std::cout它看起来像gdb中的一个bug。gdb将
symarg
设置为
-s
后面的参数,但随后在代码中,它无条件地将
symarg
设置为可执行文件的名称。建议的最小差异如下:

$ diff -C 1 main.c.orig main.c
*** main.c.orig 2014-07-29 08:37:42.000000000 -0400
--- main.c      2014-09-02 16:27:54.079039046 -0400
***************
*** 864,866 ****
        }
!       symarg = argv[optind];
        execarg = argv[optind];
--- 864,866 ----
        }
!       if (symarg == NULL) symarg = argv[optind];
        execarg = argv[optind];
***************
*** 877,879 ****
        {
!         symarg = argv[optind];
          execarg = argv[optind];
--- 877,879 ----
        {
!         if (symarg == NULL) symarg = argv[optind];
          execarg = argv[optind];

很好的发现。我希望你计划打开一个bug报告(at),并在那里提出一个补丁,或者让它上游。
[root@centos crash]# gdb -s foo.dbg foo core.28091
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/lab/crash/foo...(no debugging symbols found)...done.
[New Thread 28091]
Missing separate debuginfo for
Try: yum --disablerepo='*' --enablerepo='*-debug*' install /usr/lib/debug/.build-id/81/a81be2e44c93640adedb62adc93a47f4a09dd1
Reading symbols from /usr/lib64/libstdc++.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib64/libstdc++.so.6
Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libgcc_s.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libgcc_s.so.1
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Core was generated by `./foo'.
Program terminated with signal 11, Segmentation fault.
#0  0x000000000040076f in bar() ()
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.x86_64 libgcc-4.4.7-4.el6.x86_64 libstdc++-4.4.7-4.el6.x86_64
(gdb) bt
#0  0x000000000040076f in bar() ()
#1  0x00000000004007b7 in foo() ()
#2  0x00000000004007d1 in main ()
(gdb) list
No symbol table is loaded.  Use the "file" command.
$ diff -C 1 main.c.orig main.c
*** main.c.orig 2014-07-29 08:37:42.000000000 -0400
--- main.c      2014-09-02 16:27:54.079039046 -0400
***************
*** 864,866 ****
        }
!       symarg = argv[optind];
        execarg = argv[optind];
--- 864,866 ----
        }
!       if (symarg == NULL) symarg = argv[optind];
        execarg = argv[optind];
***************
*** 877,879 ****
        {
!         symarg = argv[optind];
          execarg = argv[optind];
--- 877,879 ----
        {
!         if (symarg == NULL) symarg = argv[optind];
          execarg = argv[optind];