2015-03-15 3 views
0

У меня есть несколько экземпляров определенного процесса, выполняющегося в моей системе. В какой-то момент во время выполнения процесса некоторые внутренние структуры данных перезаписываются недействительными данными. Это случается в случайных случаях с произвольными интервалами. Есть ли способ отладить это, кроме как путем установки точек доступа к памяти ?. Кроме того, возможно ли установить точку прерывания доступа к памяти во все эти процессы одновременно, не запуская отдельный экземпляр gdb для каждого процесса ?. Процесс выполняется в системе linux x86_64 с ядром 2.6.Gdb на нескольких экземплярах

ответ

0

Если вы еще этого не сделали, рекомендуем использовать valgrind (http://valgrind.org). Он может обнаруживать множество типов ошибок памяти, включая память поверх/под прогонами, утечки памяти, двойные разряды и т. Д.

0

Кроме того, возможно ли установить точку доступа к памяти во всех этих процессах одновременно без запуска отдельного экземпляра gdb для каждого процесса?

Я не думаю, что с помощью gdb вы можете установить точки останова для всех процессов за один раз. По моему мнению, вы отдельно подключаете каждый процесс и устанавливаете точки останова.

0

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

См http://man7.org/linux/man-pages/man1/valgrind.1.html

Что касается вашего вопроса о GDB, экземпляр может отладить один процесс только на один раз.

0

Вы можете только отлаживать один процесс на сеанс gdb. Если ваши программные вилки, gdb следует за родительским процессом, если не было дано никаких других опций set follow-fork-mode.

см: http://www.delorie.com/gnu/docs/gdb/gdb_26.html

Если у вас есть проблемы с памятью можно даже запустить Valgrind в сочетании с GDB или использовать какую-либо другую память отладки библиотеки как efence. Efence заменяет некоторые вызовы библиотеки, например. malloc/бесплатно с собственными функциями. После этого efence, а также valgrind используйте mmu, чтобы поймать недопустимый доступ к памяти. Обычно это делается путем добавления некоторого пространства до и после каждого выделенного блока памяти. Если к этой резервной памяти обращается ваше приложение, библиотека (efence) или valgrind прекращает выполнение. В связи с gdb вы будете указывать на строку источника, которая обращается к запрещенной области памяти.

Наличие нескольких процессов требует нескольких экземпляров gdb, которые практически не имеют реальной проблемы.