сбой приложения Windows при чисто виртуальном вызове функции - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть приложение для Windows, оно время от времени вылетает и не воспроизводится.Когда это происходит, я получаю чисто виртуальную функцию.Я настроил его для создания дампа Windows с использованием ADplus, и даже при сбое он никогда не создается.

Я почти уверен, что это ошибка сборки, я собираю с использованием VC2008 SP1, и это релизbuild.

Есть идеи по этому поводу?Как я могу это отладить, это сборка релиза с файлом .pdb и файлом карты.

Спасибо, Реза

Ответы [ 7 ]

2 голосов
/ 18 апреля 2011

Как уже указывалось, очень маловероятно, что это ошибка сборки. У меня был довольно сложный проект с похожей проблемой, и я смог отследить его, используя _set_purecall_handler и предоставив свой собственный обработчик. Таким образом я смог взломать отладчик, когда это произошло, и увидеть стек вызовов. Очевидно, что альтернативой здесь является создание минидампа, когда это происходит. Помните, что вам нужно подготовить все для минидампа до того, как программа обнаружит исключение.

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

Проект, о котором я упоминал выше, был устаревшим проектом, который моделировал нечто похожее на COM, и действительно были места, где компилятор не мог найти все случаи чисто виртуальных функций, для которых не было реализации в производных классах.

2 голосов
/ 18 апреля 2011

Прежде всего, убедитесь, что вы не вызываете чисто виртуальную функцию . Если это не так, попробуйте запустить программу под WinDbg .

1 голос
/ 18 апреля 2011

Я почти уверен, что это ошибка сборки

Очень, очень un вероятно.Скорее всего, это ошибка в вашем коде.

Возможно, вы нарезаете объект где-нибудь.Если у вас настроено приложение для создания файла дампа на незафиксированные исключения и вы все еще умираете без файла дампа, то вполне возможно, что ошибка в обработчике исключений.

Вам нужночтобы получить файл дампа.Это должно быть вашим первым приоритетом.

0 голосов
/ 13 февраля 2015

У меня такая же ошибка. Я много раз проверял код и никогда не обнаруживал использование виртуальных функций в конструкторах или деструкторах. Проблема была в системе сборки. У меня была старая версия статической библиотеки на моем компьютере, где какая-то функция была не чисто виртуальной, а новая, когда она стала (я добавил еще один уровень абстракции). Поскольку файл EXE был создан со старой статической библиотекой, но с новыми заголовками, появилась эта ошибка. Поэтому убедитесь, что ваши библиотеки и версии включаемых файлов согласованы, если ничего не помогает.

0 голосов
/ 19 апреля 2011

Однажды у меня была похожая проблема с C ++. У меня был вызов виртуальной функции из конструктора где-то, поэтому объект еще не был сконструирован, когда произошел вызов, что объясняет "чистую" виртуальную функцию, вызываемую. Это также может быть проблемой нарезки , если у вас плохие приведения к объектам вместо указателей на объекты. Используйте отладчик и шаг за шагом / возврат , чтобы найти источник, чтобы мы могли помочь вам лучше.

0 голосов
/ 18 апреля 2011

Если вы попытались полностью перестроить, то, скорее всего, это проблема кодирования.

Вы вызываете какие-либо (чистые) виртуальные функции в каких-либо конструкторах или деструкторах?

Скорее всего, вы вызываете чисто виртуальную функцию для удаленного объекта, и виртуальная таблица была перемещена, чтобы указать на родительский объект. В этом случае вам могут помочь Valgrind (free, linux) или Purify ($$$, Windows). VS также может иметь проверку памяти с ним.

0 голосов
/ 18 апреля 2011

Если ваша проблема не постоянна, скорее всего, есть проблемы с записью вне индекса, которая может повредить память

...