c++ - 在 OS X 上使用 MacPorts GCC 调试问题

标签 c++ macos gcc gdb

对于使用 GCC 4.7 MacPorts build 编译的程序,我似乎无法获得可读的调试输出。

我已经尝试过 GDB 6.3 和 GDB 7.3,每个都有自己的问题。

尝试使用 GDB 7.3 (MacPorts)

在 GDB 7.3 中,我在启动时得到以下输出:

$ ggdb ./test
GNU gdb (GDB) 7.3
Copyright (C) 2011 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-apple-darwin11.4.0".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
BFD: unable to read unknown load command 0x24
BFD: unable to read unknown load command 0x26
BFD: unable to read unknown load command 0x24
BFD: unable to read unknown load command 0x26
Reading symbols from /Users/StackedCrooked/programming/projects/stacked-crooked/Playground/LockOrderChecker/test...Reading symbols from /Users/StackedCrooked/programming/projects/stacked-crooked/Playground/LockOrderChecker/test.dSYM/Contents/Resources/DWARF/test...done.
done.

运行并触发断言会导致不可读的堆栈跟踪:

(gdb) r
Starting program: /Users/StackedCrooked/programming/projects/stacked-crooked/Playground/LockOrderChecker/test 
BFD: unable to read unknown load command 0x24
BFD: unable to read unknown load command 0x26
main
Assertion failed: (false), function lock, file main.cpp, line 168.

Program received signal SIGABRT, Aborted.
0x00007fff8ede282a in ?? ()

(gdb) bt
#0  0x00007fff8ede282a in ?? ()
#1  0x00007fff9a273a9c in ?? ()
#2  0x00007fff6af00690 in ?? ()
#3  0x0000003000000030 in ?? ()
#4  0x00007fffffffffdf in ?? ()
#5  0x000000010b305840 in ?? ()
#6  0x00007fff6af006d0 in ?? ()
#7  0x00007fff9a2a65de in ?? ()
#8  0x0000000000000000 in ?? ()

尝试使用 GDB 6.3(内置)

根据 this answer我应该使用 GDB 6.3。然而,这会导致一系列不同的问题。在启动过程中,我遇到了一堆错误:

GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Thu Nov  3 21:59:02 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries .
warning: Could not find object file "/Volumes/work/macports/var/macports/build/_Volumes_work_mports_dports_lang_gcc47/gcc47/work/build/x86_64-apple-darwin11/libstdc++-v3/src/.libs/compatibility.o" - no debug information available for "../../../../gcc-4.7.1/libstdc++-v3/src/c++98/compatibility.cc".


warning: Could not find object file "/Volumes/work/macports/var/macports/build/_Volumes_work_mports_dports_lang_gcc47/gcc47/work/build/x86_64-apple-darwin11/libstdc++-v3/src/.libs/compatibility-debug_list.o" - no debug information available for "../../../../gcc-4.7.1/libstdc++-v3/src/c++98/compatibility-debug_list.cc".

warning: Could not find object file "/Volumes/work/macports/var/macports/build/_Volumes_work_mports_dports_lang_gcc47/gcc47/work/build/x86_64-apple-darwin11/libstdc++-v3/src/.libs/compatibility-debug_list-2.o" - no debug information available for "../../../../gcc-4.7.1/libstdc++-v3/src/c++98/compatibility-debug_list-2.cc".

如果断言被触发并且我尝试获取回溯,这是我看到的:

Assertion failed: (false), function lock, file main.cpp, line 168.

Program received signal SIGABRT, Aborted.
0x00007fff8ede282a in __kill ()
(gdb) bt
#0  0x00007fff8ede282a in __kill ()
#1  0x00007fff9a273a9c in abort ()
#2  0x00007fff9a2a65de in __assert_rtn ()
Die: DW_TAG_unspecified_type (abbrev = 19, offset = 423)
    has children: FALSE
    attributes:
        DW_AT_name (DW_FORM_strp) string: "decltype(nullptr)"
Die: DW_TAG_unspecified_type (abbrev = 19, offset = 423)
    has children: FALSE
    attributes:
        DW_AT_name (DW_FORM_strp) string: "decltype(nullptr)"
Dwarf Error: Cannot find type of die [in module /Users/StackedCrooked/programming/projects/stacked-crooked/Playground/LockOrderChecker/test.dSYM/Contents/Resources/DWARF/test]

根据 this answer (引用 GCC 4.5 手册)我应该使用 -gdwarf-2 -gstrict-dwarf 选项。

我听从了这个建议。我的构建命令如下所示:

g++ -o run-test -std=c++0x -Wall -Wextra -Werror -gdwarf-2 -gstrict-dwarf -g2 -O0 -I/opt/local/include main.cpp

但是,它并没有解决上述任何问题。

郑重声明:我使用的是 OS X Lion。

有人知道如何解决这个问题吗?

最佳答案

根据 g++ 手册页,您应该使用 -ggdb 为 gdb 生成调试符号。顺便说一句,根据我的经验(在 linux、windows (mingw) 和 mac 上),仅使用 -g 总是为 gdb 生成好的符号。

关于c++ - 在 OS X 上使用 MacPorts GCC 调试问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12430972/

相关文章:

c++ - 结构的 CPU 开销?

windows - 使用 Xamarin 在 Windows 上编译 OSX 应用程序

c - 为什么 gcc 中 '-l' 选项的顺序很重要?

c++ - ZeroMQ:如何将 Poller 中使用的 pollitem_t 项转换回 ZeroMQ 套接字?

c++ - 如何找到 InternetRegistry 用户 key 或父注册表 key

c++ - 为什么从未使用过 C3 分配构造函数?

macos - 如何在 macOS 中创建虚拟界面?

macos - 如何在 OSX 上注册文档 MIME 类型,以便它出现在浏览器 navigator.MIMETypes 数组中

c++ - 如何使用多个版本的 GCC

c++ - GCC 4.2.x 是否创建构造函数?