чисто виртуальный метод вызывается только в GDB - PullRequest
0 голосов
/ 04 марта 2020

Я использую буферный код протокола Google в моей программе, который работает нормально, когда я запускаю свою программу нормально, но вылетает, если я запускаю его под GDB. По сути, я получаю экземпляр функции прото-класса google в функции через входные аргументы в качестве указателя и набираю его в классе буфера протокола, а затем вызываю функцию parseFromString, которая работает нормально. Но если он запускается под GDB, я получаю Чистый виртуальный метод , называемый ошибкой.

Благодарю кого-нибудь за некоторые предложения относительно того, почему это происходит.

Заранее спасибо.

1 Ответ

0 голосов
/ 04 марта 2020

Благодарим всех, кто подскажет, почему это происходит.

Существует две вероятные причины: гонка данных (если ваша программа многопоточная) или чувствительность макета адреса.

GDB влияет на время создания и уничтожения потока, и если у вас нет правильной синхронизации между потоками, поток T1 может пытаться ParseFromString объект, который уже был разрушен потоком T2.

Другое отличие между запуском программы внутри или вне GDB: GDB (по умолчанию) отключает рандомизацию адресов.

Вы можете включить рандомизацию адресов внутри GDB с помощью set disable-randomization off, а рандомизацию вне GDB можно отключить с помощью запустить вашу программу так: setarch $(uname -m) -R ./a.out.

...