0

プログラムに C++11 (OS X 上の Clang および libc++ を使用) を使用しようとしていますが、gdb でデバッグして標準コンテナーを検査しようとすると、gdb segfaults が発生します。最小限の例を次に示します。

ファイル.cpp:

#include <iostream>
#include <string>

int main(int argc, char* argv[])
{
    std::string str = "Hello world";

    std::cout << str << std::endl; // Breakpoint here
}

以下を使用して C++11 用にコンパイルすると:

$ c++ --version
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.4.0
Thread model: posix
$
$ c++ -ggdb -std=c++11 -stdlib=libc++ -Wall -pedantic -O0 -c file.cpp
$ c++ -ggdb -std=c++11 -stdlib=libc++ -Wall -pedantic -O0 file.o -o program

そして、次のようにデバッグすると、次のことを試みるとクラッシュしp str.size()ます。

$ gdb program
GNU gdb 6.3.50-20050815 (Apple version gdb-1824) (Wed Feb  6 22:51:23 UTC 2013)
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 ... done

(gdb) br file.cpp:8
Breakpoint 1 at 0x100000d80: file file.cpp, line 8.
(gdb) run
Starting program: /Users/mjbshaw/School/cs6640/2/program 
Reading symbols for shared libraries ++............................. done

Breakpoint 1, main (argc=1, argv=0x7fff5fbffab0) at file.cpp:8
8       std::cout << str << std::endl; // Breakpoint here
(gdb) p str.size()

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000
std::__1::operator<< <char, std::__1::char_traits<char>, std::__1::allocator<char> > (__os=@0x7fff5fc3d628, __str=@0x1) at string:1243
1243    
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on"
Evaluation of the expression containing the function (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__is_long() const) will be abandoned.

これを gdb で実行しない場合、クラッシュは発生せず、正常に動作します (ただし、プログラムをデバッグするには gdb が必要です)。また、コンパイル オプションから削除する-std=c++11 -stdlib=libc++と (gdb でも) 正常に動作しますが、プログラムには C++11 が必要です。

gdb と C++11 (特に libc++) に関する既知の問題はありますか? libc++ と libstdc++ を一緒に使用すると問題が発生する可能性があることはわかっていますが、それらを一緒に使用しようとはしていません (少なくとも意識的にではありません。使用したいのは libc++ だけです)。いくつかのコンパイル オプションを間違って指定していませんか? OS X で C++11 用に適切にコンパイルし、適切にデバッグできる方法はありますか?

4

1 に答える 1

1

GDB 6.3 はほぼ 9 年前のものです。それは、インターネット時代の永遠のことです。それ以来、製品は大幅に改善されました。最新の安定版リリースに更新することは、すべての開発者にとって必須です。

于 2013-09-23T19:05:03.777 に答える