最新バージョンのOSX10.8.2と最新のXcode4.5で、次の問題が発生しています。
次の簡単なコードを取ります。
#include <iostream>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, const char * argv[])
{
pid_t pid = fork();
if (0 == pid)
{
std::cout << "Child process!\n";
exit(0);
}
else if (-1 == pid)
{
std::cout << "Error forking.\n";
}
else
{
std::cout << "In parent, created pid " << pid << ".\n";
sleep(100000); // Sleep a long time - GDB/LLDB ignores the first sleep statement
sleep(3); // Sleep 3 more seconds - GDB/LLDB doesn't ignore the second sleep statement
std::cout << "Done in parent!\n";
}
return 0;
}
clang++ foo.cpp -o foo
またはを使用してコンパイルし、を使用しg++ foo.cpp -o foo
て実行し./foo
ます。予想どおり、実行には長い時間がかかります。
またはのいずれlldb ./foo
かgdb ./foo
を実行run
してから、3秒で完了することに注意してください。いずれかのデバッガーが使用される場合は常に、最初のスリープステートメントは無視されているように見えます。
Xcodeはプロジェクトの実行時にデフォルトでlldbを使用するため、上記のコードを空のXcodeプロジェクトに貼り付けて、Product->Runを実行すると同様の結果が得られます。
gdb 7.2を搭載したLinuxマシンで同じ実験を試しましたが、問題は発生しません。
これは、Appleが使用している古いバージョンのgdb(gdb 6.3.50-20050815(Appleバージョンgdb-1822))のバグですか、それとも別のものですか?他のOSXユーザーに起こらなければ、おそらく私のコンピューターだけが台無しになっているのでしょうか。