У меня много проблем с отладкой ошибки сегментации в проекте C ++ в XCode 4.
Я получаю segfault только при сборке с опцией компилятора "LLVM 2.0" и использую оптимизацию -O3. Из того, что я понимаю, возможности отладки ограничены, когда используется оптимизация, но вот выходные данные отладки, которые я получаю после запуска в Xcode с включенным gdb:
warning: Got an error handling event: "Dwarf Error: Cannot find DIE at 0x3be2 referenced from DIE at 0x11d [in module /Users/imran/Library/Developer/Xcode/DerivedData/cgo-hczcifktgscxjigfphieegbpxxsq/Build/Products/Debug/cgo]".
No memory available to program now: unsafe to call malloc
Я не могу заставить GDB дать мне какую-либо полезную информацию после этого (например, след), но я не уверен, что действительно знаю, как правильно ее использовать. Когда я пытаюсь использовать отладчик "LLDB", Xcode просто падает (это было обычной темой с тех пор, как я начал его использовать).
Моя программа детерминирована, но когда я пытаюсь изолировать проблему с помощью операторов print, поведение меняется. Например, если я добавлю cout << "hello";
в какой-то момент, segfault исчезнет. Другие операторы печати приводят к тому, что моя программа перестает работать в другой итерации своего основного цикла. И естественно, когда я вставляю достаточно выражений print, чтобы предположительно точно определить код, вызывающий сбой, segfault, кажется, происходит после одной строки, но перед следующей (т.е. нигде).
Я использую указатели и динамическое выделение памяти, что, вероятно, является причиной проблемы, но так как я не могу сузить блок кода, вызывающий ошибку, я не знаю, какой код показывать здесь.
Я попытался выполнить профилирование с помощью инструмента "Утечки" в Инструментах, но он не обнаружил никаких утечек.
Любой совет? Я не очень разбираюсь в отладке, так что на самом деле все может помочь.
РЕДАКТИРОВАТЬ: Решено. При определенных входных данных моя программа будет пытаться прочитать после конца массива.