в дампе ядра gdb c ++ я могу видеть, выделен ли еще указатель? - PullRequest
2 голосов
/ 22 мая 2009

У меня есть дамп памяти на диске, созданный приложением, которое провалило утверждение и прервало работу. Приложение было скомпилировано в режиме отладки на Linux / g ++. Я подозреваю, что в кадре стека в верхней части стека мой this объект был delete 'd (я думаю, this больше не является допустимым ptr). Однако для воспроизведения этого прерывания могут потребоваться дни или даже больше.

Есть ли способ для меня запросить новую / свободную реализацию из GDB (или в другом месте) и проверить, является ли данный адрес памяти действительной выделенной памятью? Другими словами, могу ли я узнать, выделен ли мой this, или, скорее всего, deleted 'd? Это должно быть статично, так как у меня просто дамп ядра, а не запущенный исполняемый файл.

Ответы [ 2 ]

1 голос
/ 22 мая 2009

Это не невозможно, но это чертовски близко, если вы используете стандартные вызовы malloc / free / new / delete. Если вы думаете, что сможете воспроизвести проблему через несколько дней, возможно, это более быстрый путь.

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

Dmalloc - это бесплатная утилита, которую вы можете использовать, которая заменяет стандартные функции памяти C / C ++ версиями, которые могут выполнять дополнительные проверки и бухгалтерию.

LD_PRELOAD=libdmalloc.so your_program_here запустит программу с dmalloc, и вы можете установить флаги для очистки памяти, чтобы вы знали, была ли удалена какая-либо память.

0 голосов
/ 22 мая 2009

Дамп ядра содержит полное состояние программы на момент выхода (включая состояние выделения памяти для процессов). Однако вам необходимо глубоко знать, как работает распределение памяти, чтобы выяснить, является ли объект по-прежнему действительным или нет. Однако проверка состояния программы в отладчике может привести к обнаружению проблемы даже без знания точной стратегии выделения памяти. Вы проверяли стеки всех потоков на очевидные «плохие» значения? Они могут дать вам очень ценные советы.

Еще одна очень хорошая идея - запустить приложение в valgrind .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...