Благодарим всех, кто подскажет, почему это происходит.
Существует две вероятные причины: гонка данных (если ваша программа многопоточная) или чувствительность макета адреса.
GDB влияет на время создания и уничтожения потока, и если у вас нет правильной синхронизации между потоками, поток T1 может пытаться ParseFromString
объект, который уже был разрушен потоком T2.
Другое отличие между запуском программы внутри или вне GDB: GDB (по умолчанию) отключает рандомизацию адресов.
Вы можете включить рандомизацию адресов внутри GDB с помощью set disable-randomization off
, а рандомизацию вне GDB можно отключить с помощью запустить вашу программу так: setarch $(uname -m) -R ./a.out
.