В чем может быть причина того, что gdb, запускающий мою программу и просто bash, выполняющий мою программу, показывает разные результаты? - PullRequest
1 голос
/ 15 июля 2011

Когда я отлаживаю свою программу на c ++ с помощью gdb в linux?Я компилирую с -g и на самом деле, я вижу много информации в отладчике, но он постоянно говорит мне, что моя программа завершается нормально и не выдает никаких ошибок.Когда я просто запускаю свою программу, она не заканчивается и показывает, что не все в порядке (одно утверждение в malloc.c не удалось).

У меня также был случай, когда gdb и только что запущенная программа показывали разные сообщения об ошибках.ошибки всегда связаны с неправильными указателями, обращениями к памяти.

То же самое и с valgrind.Есть ли вероятность того, что невозможно использовать valgrind?В частности, если есть разные процессы и включена общая библиотека?

Запуск ее с помощью valgrind с помощью: valgrind --trace-children = yes prog1 не выдаст мне ошибок (что не может быть правдой), если я включуподавление ошибок: valgrind -v --trace-children = yes prog1, я получаю предупреждения о конфликтах перенаправления (тоже не похоже на ошибки).

Ответы [ 3 ]

6 голосов
/ 15 июля 2011

Проблема с ошибочными программами заключается в том, что их поведение не определено. Иногда они работают, а в другое время непредсказуемо.

И Valgrind, и GDB влияют на время выполнения программы и могут скрывать условия гонки (что может случиться как для многопоточных, так и для многопроцессорных программ).

Кроме того, GDB отключает рандомизацию адресного пространства, делая адреса в программе повторяемыми от запуска к запуску. Обычно это то, что вам нужно при отладке, но ваш сбой может проявиться только для определенной случайной компоновки разделяемых библиотек, и эта компоновка может никогда не произойти в GDB.

Лучше всего включить генерацию дампов ядра (ulimit -c unlimited), запустить программу за пределами GDB и отменить ее (сбой assert вызывает abort). Получив ядро, отладьте его с помощью GDB: gdb /path/to/your/executable core.

Для описанных вами проблем Valgrind обычно является лучшим инструментом. Если задействовано несколько процессов, вам нужно запустить valgrind с флагом --trace-children=yes.

0 голосов
/ 15 июля 2011

Я бы включил все предупреждения в компиляции с помощью -Wall, чтобы gcc предупредил вас о неинициализированных переменных, а затем запустил его в valgrind.Один из них должен рассказать вам о проблеме.

0 голосов
/ 15 июля 2011

Это может быть проблема многопоточности, и GDB замедляет ее настолько, что ваши потоки не конфликтуют.Также, может быть, программа оптимизирована?Валгринд говорит, что все в порядке?

...