отсутствующие файлы ядра, когда SEGV встречается в потоке, отличном от основного потока - PullRequest
3 голосов
/ 16 марта 2020

В настоящее время я отлаживаю segfault в одном из наших приложений на c ++, и мне трудно, так как при возникновении segfault не создаются файлы ядра.

После некоторого чтения и проверки ulimit и т. Д. Я могу воспроизвести случай, когда файлы ядра не генерируются. Кажется, как-то связано с темами. Для этого я изменил наше программное обеспечение для искусственного генерирования SEGV:

Теперь появляется следующий шаблон

  • SEGV в главном потоке -> генерируется основной файл
  • SEGV в не основной поток -> no генерируется основной файл

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

  • Отправка файла ядра kill -s SIGSEGV - -> генерируется

Затем я выполняю поиск в файле und / proc / / task для неосновной и получил идентификатор

  • Отправка "kill -s SIGSEGV " -> нет генерируется основной файл

Знаете ли вы о какой-нить специфицирует c свойства, которые бы объясняли такое поведение?

Я также пробовал один и тот же код под разными ОС, и это происходит только в нашей производственной среде (redhat6), а не под Ubuntu. Я все еще пытаюсь выяснить, может ли это быть связано со сборками Debug / Non-Debug.

Тем не менее поведение кажется настолько странным, что оно должно быть из-за некоторой тонкости. Мне также интересно, если бы я хотел создать такое поведение специально, я бы даже не знал, что изменить, чтобы добиться этого.

Любая помощь приветствуется.

С наилучшими пожеланиями, Матиас

1 Ответ

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

Для чего он стоит - он имел какое-то отношение к corepattern, который я обнаружил с помощью проб и ошибок

core_pattern  core                   -> corefile
core_pattern  /opt/tmp/core          -> corefile
core_pattern  /opt/tmp/core_%e.%p    -> no corefile
core_pattern  /opt/tmp/core_%e       -> no corefile
core_pattern  /opt/tmp/core_%h       -> corefile
core_pattern  /opt/tmp/core_%h_%p    -> corefile
core_pattern  /opt/tmp/core_%h_%p_%e -> no corefile

Так что% e, кажется, является причиной, почему иногда не пишется ядро. Затем имя файла основного дампа получает имя потока вместо имени исполняемого файла с core_pattern% e.% P.core объясняет, что происходит, а именно, что% e не является именем исполняемого файла, но содержит информацию о потоках, которая в Мой случай содержит "/"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...