У меня есть несколько экземпляров определенного процесса, выполняющегося в моей системе. В какой-то момент во время выполнения процесса некоторые внутренние структуры данных перезаписываются недействительными данными. Это случается в случайных случаях с произвольными интервалами. Есть ли способ отладить это, кроме как путем установки точек доступа к памяти ?. Кроме того, возможно ли установить точку прерывания доступа к памяти во все эти процессы одновременно, не запуская отдельный экземпляр gdb для каждого процесса ?. Процесс выполняется в системе linux x86_64 с ядром 2.6.Gdb на нескольких экземплярах
ответ
Если вы еще этого не сделали, рекомендуем использовать valgrind (http://valgrind.org). Он может обнаруживать множество типов ошибок памяти, включая память поверх/под прогонами, утечки памяти, двойные разряды и т. Д.
Кроме того, возможно ли установить точку доступа к памяти во всех этих процессах одновременно без запуска отдельного экземпляра gdb для каждого процесса?
Я не думаю, что с помощью gdb вы можете установить точки останова для всех процессов за один раз. По моему мнению, вы отдельно подключаете каждый процесс и устанавливаете точки останова.
Для ошибок памяти valgrind гораздо полезнее, чем GDB. Предполагая, что экземпляры, о которых вы говорите, раздвоены или порождены от одного родителя, вам не нужны отдельные экземпляры valgrind. Просто используйте Valgrind --trace-дети = да
См http://man7.org/linux/man-pages/man1/valgrind.1.html
Что касается вашего вопроса о GDB, экземпляр может отладить один процесс только на один раз.
Вы можете только отлаживать один процесс на сеанс 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, которые практически не имеют реальной проблемы.