Я работаю с однопотоковым родным приложением C++. Очень сложно воспроизвести ошибку, которую я не могу воспроизвести локально. Я включил полную кучу страниц и отладочную информацию в исполняемом файле, и получил дампы от клиента (который должен использовать приложение много дней, чтобы получить ошибку).возможное повреждение кучи (win 32, native C++)
Что клиент сообщает: приложение зависает и никогда не восстанавливается. Его нужно убить из диспетчера задач. Что я вижу из дампов: приложение застревает в бесконечном цикле.
Петля - это переход по двойному связанному списку, который стал циклическим. Существуют признаки повреждения памяти, так как многие члены данных имеют странные значения, например, нулевые совпадения, значения под 0000FFFF или сам связанный список, как сообщается, составляют 300 миллионов +, что не является нормальным.
Единственная другая информация, которую я могу получить из дампов, заключается в том, что операция чтения сокетов не удалась с чтением 0 данных. Это приводит к ходу (теперь циклического) списка.
У меня есть несколько свалок, все висящие в одном и том же бесконечном цикле. Я попытался получить трассировку стека выделения, но! Heap -p -a дает мне «Ошибка ReadMemory для адреса eeddccee Используйте`! Address eeddccee ', чтобы проверить правильность адреса. " для всех адресов, которые я пробовал.
В настоящее время я изучаю предупреждения L4 (за исключением того, что я не знаю, что может быть связано с этим, у меня есть куча C4100, C4511, C4512, которые я не знаю, как исправить, м, в основном фиксируя без проблем как C4244). DebugDiag ничего не нашел, кроме как дать мне «Этот поток не полностью разрешен и может быть или не быть проблемой. Может потребоваться дальнейший анализ этих потоков». на одном потоке.
Из того, что я вижу, мои варианты фиксируют больше предупреждений, перечитывая код, пока что-то не скачет ко мне или не узнает что-то новое отсюда.
Действительно ли это повреждение памяти? Почему он каждый раз висит в одной структуре? Как я могу найти причину?
Вы выполняете обработку исключений? Например, вы ловите исключения, регистрируете их и продолжаете работать? –
вокруг кода, который бесконечно петляет, есть попытка/catch (...), который я регистрирую; журнал показывает иногда исключение (я не записывал детали) из кода, который петли, но программа продолжается; когда ошибка на самом деле происходит, не возникает никакого исключения, блок catch больше не достигнут –