Для обработки сигнала segfault SIGSEGV необходимо определить причину segfault с помощью siginfo_t - PullRequest
3 голосов
/ 26 ноября 2009

Я делаю оболочку для библиотеки pthread, которая позволяет каждому потоку иметь свой собственный набор неиспользуемой памяти. Прямо сейчас способ c установлен, если какой-либо поток пытается переписать данные другого потока, программа сбоит. Это нормально, я могу поймать его с помощью sighandler и вызвать pthread_exit() и продолжить работу с программой.

Но не каждый segfault будет результатом плохой ошибки. Мне нужно найти способ использовать тип siginfo, чтобы определить, было ли segfault плохим программированием или эта ошибка. Есть идеи?

Поскольку я использую mmap для управления страницами памяти, я думаю, что использование si_addr в siginfo поможет мне.

1 Ответ

1 голос
/ 29 октября 2010

Похоже, что вы действительно ищете локальное хранилище потоков, которое уже решено гораздо более мобильно, чем это. GCC обеспечивает __thread, MSVC обеспечивает __declspec(thread). boost :: thread предоставляет переносимое локальное хранилище потоков с использованием различных механизмов в зависимости от платформы / набора инструментов и т. Д.

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

В прошлом я несколько раз успешно использовал этот трюк, обычно для пометки «страниц» как «грязных» в пространстве пользователя. Я сделал это, настроив хеш-таблицу, которая содержала базовый адрес всех «страниц» памяти, которые меня интересовали. Когда вы перехватываете SIGSEGV в обработчике, вы можете затем отобразить адрес обратно на страницу с простым арифметические операции. При условии, что хеш-таблица может быть прочитана без блокировок, вы можете найти ее, если вам нужна эта страница, или segfault откуда-то еще и решить, как действовать.

...