/ / Чому помилка сегментації не відтворюється в gdb? - linux, gdb, googletest, googlemock

Чому сегментація помилки не відтворюється в gdb? - linux, gdb, googletest, googlemock

У мене ситуація, коли я запускаю ряд одиницьтести, і один з них запускає помилку сегментації. Симптом, здається, пов'язаний з іншим тестовим випадком, приблизно до 30 тестових випадків до невдалого. Очевидно, що між тестовими випадками існує деяка залежність, і я можу легко включати та вимикати помилки сегментації, коментуючи попередній тестовий випадок. Google Test / Mock 1.6.0 використовується як тестова основа. Тестовий двійковий файл записується повністю на C ++ (gcc 4.6.3). Він є однопоточним (якщо Google Test не створює теми).

Однак, коли я запускаю всі тестові випадки в gdb, немає помилки в сегментації, і це мене здивує.

Які реалістичні причини, чому не було бпомилка сегментації при запуску двійкового файлу в терміналі, але не при запуску самого того ж бінарного через gdb? Я думаю, що все трохи повільніше, коли gdb запускає код, але я не бачу, як це вплине на результат.

Я просто роблю це, щоб не помилитися:

gdb MyBinary
run

Останні рядки роздруківки терміналу:

[  PASSED  ] 368 tests.
[Inferior 1 (process 28349) exited normally]

І це, щоб побачити провину:

MyBinary

Останній рядок роздруківки терміналу:

Segmentation fault

Відповіді:

5 за відповідь № 1

Які реалістичні причини, чому не було б помилки сегментації при запуску двійкового файлу в терміналі, а не при запуску того самого бінарного через gdb?

Дві найпоширеніші з них:

  1. GDB вимикає рандомізацію адресного простору. Якщо ви читаєте якийсь неініціалізований вказівник, такий вказівник завжди буває NULL під GDB, але може не бути NULL з ASLR.
  2. У вас є гонка даних, і GDB уповільнює створення ниток, щоб приховати цю гонку (GDB повинен зробити це багато роботи, щоб відстежувати всі теми).

Ви можете запобігти GDB відключити ASLR за допомогою set disable-randomization off.

Ви, ймовірно, повинні перевірити свої тести, використовуючи MemorySanitizer і ThanadSanitizer.