У мене ситуація, коли я запускаю ряд одиницьтести, і один з них запускає помилку сегментації. Симптом, здається, пов'язаний з іншим тестовим випадком, приблизно до 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?
Дві найпоширеніші з них:
- GDB вимикає рандомізацію адресного простору. Якщо ви читаєте якийсь неініціалізований вказівник, такий вказівник завжди буває
NULL
під GDB, але може не бутиNULL
з ASLR. - У вас є гонка даних, і GDB уповільнює створення ниток, щоб приховати цю гонку (GDB повинен зробити це багато роботи, щоб відстежувати всі теми).
Ви можете запобігти GDB відключити ASLR за допомогою set disable-randomization off
.
Ви, ймовірно, повинні перевірити свої тести, використовуючи MemorySanitizer і ThanadSanitizer.