GDB следит за огромным объемом памяти, чтобы обнаружить повреждение, здесь нет ошибок - PullRequest
3 голосов
/ 19 марта 2012

Обновлено: теперь с valgrind --tools=memcheck --track-origins=yes --leak-check=full ./prog он работает правильно, но без этого valgrind все равно идет не так, как это происходит?

Я делаю проект для Linux, который хранит много данных в памяти, и мне нужно знать, какой блок данных изменен, чтобы найти проблему в моей программе.

Обновлено: это многопоточная программа, и запись / чтение выполняется различными потоками, которые создаются системными вызовами.

код такой

for(j=0;j<save_size;j++){
    e->blkmap_mem[blk_offset+save_offset + j] = get_mfs_hash_block();
    memcpy(e->blkmap_mem[blk_offset + save_offset +j]->data, (char *)buff + j * 4096, 4096);
    e->blkmap_mem[save_offset+j]->data = (char *)(buff + j* 4096);
    e->blkmap_mem[blk_offset+save_offset + j]->size = 4096;
    e->blkmap_addr[blk_offset+save_offset + j] = 1;

И я хочу знать, если e->blkmap_mem[blk_offset+save_offset+j]->data изменено где-то еще.

Я знаю, awatch exp в gdb может проверить, изменяется ли значение, но здесь их слишком много, есть ли способ отследить их все, я имею в виду, что их может быть около 6000.

Спасибо, ребята.

1 Ответ

7 голосов
/ 19 марта 2012

Обратная отладка имеет отличный пример использования, если у вас есть какой-то способ обнаружить повреждение, как только оно произошло (ошибка сегмента подойдет).

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

Вот шагпошаговое руководство:

  1. Скомпилируйте программу с обычными символами отладки и загрузите ее в GDB.
  2. Запустите программу, используя start.
    • Это ставит точку останова в самом начале main и запускает программу до тех пор, пока она не достигнет ее.
  3. Теперь установите точку останова где-нибудь, где обнаружено повреждение памяти
    • Вам не нужно делать это, если вы обнаруживаете повреждение с ошибкой сегмента.
  4. введите record, чтобы начать запись выполнения программы
    • Вот почему мы раньше вызывали start - вы не можете записывать, когда нет запущенного процесса.
  5. continue, чтобы снова запустить программу.
    • Во время записи программа будет работать очень медленно
    • Она может сказать, что буфер записи заполнен - ​​если это произойдет, скажите, чтобы он обернулся.
  6. Если ваша точка прерывания обнаружена вашей точкой останова или ошибкой сегмента, программа остановится.Теперь добавьте watch к любой поврежденной переменной.
  7. reverse-continue, чтобы запустить программу в обратном направлении, пока поврежденная переменная не будет записана.
  8. Когда попадет точка наблюдения, вы обнаружите свою коррупцию.
    • Обратите внимание, что это не всегда первое или единственное повреждение этой переменной.Но вы всегда можете продолжать работать задом наперед, пока не закончится история обратного выполнения - и теперь у вас есть что исправить.

Здесь есть полезное руководство здесь , в котором также обсуждается, как контролировать размер буфера записи, на случай, если это станет для вас проблемой.

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