Обработка сигнала SIGSEGV выдаёт ошибку сегментации необходимо определить причину Segfault с помощью siginfo_t

голоса
3

Делаю оболочку для библиотеки PTHREAD , что позволяет каждому потоку иметь свой собственный набор без общего доступа памяти. Сейчас путь с устанавливается , если какой - либо поток пытается Rwe еще нитей данных, программные ошибки сегментации. Это нормально, я могу поймать его с sighandler и позвонить pthread_exit()и продолжить с программой.

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

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

Задан 26/11/2009 в 06:59
источник пользователем
На других языках...                            


1 ответов

голоса
1

Это похоже на то , что вы на самом деле после того , как локальная память потока , которая уже решена намного более переносимо , чем это. НКУ предусматривает __thread, MSVC предоставляет __declspec(thread). повышение :: нить обеспечивает портативную нить локального хранилище с использованием различных механизмов , в зависимости от платформы / набора инструментов и т.д.

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

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

Ответил 29/10/2010 в 10:53
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more