2014-01-06 3 views
0

Я работаю над приложением на C++, работающим в Linux. Приложение имеет несколько наборов обработчиков сигналов, которые мешают друг другу. Моя задача - понять, как эти обработчики заданы и привести их в порядок. Я знаком с некоторыми из них и должен найти всех остальных. Я попытался найти исходный код для слов типа «сигнал» и «сигмент», но не смог найти обработчика, о котором я не знаю.Несколько обработчиков сигналов в приложении C++

Какие могут быть другие способы поиска этих обработчиков?

Есть ли способ увидеть/отслеживать установку этих обработчиков во время выполнения?

+0

Они могут использоваться библиотеками. Вы можете «привязать» ваше приложение, чтобы понять, что он устанавливает сигналы. Прочитайте абсолютно [сигнал (7)] (http://man7.org/linux/man-pages/man7/signal.7.html) и [sigaction (2)] (http://man7.org/linux/man -pages/man2/sigaction.2.html) и расскажите подробнее о своем приложении: есть ли у вас весь исходный код и все исходные коды библиотек; это загрузка плагинов через [dlopen (3)] (http://man7.org/linux/man-pages/man3/dlopen.3.html)? –

+0

У меня уже работает strace. Он показал несколько вызовов для rt_sigaction(). Однако он не показывает, куда пришел звонок. Приложения очень большие. Он состоит из нескольких модулей (общее количество файлов - несколько тысяч). Он работает с несколькими сторонними инструментами, такими как Oracle, ACE и т. Д. У нас есть исходный код некоторых из них, и у меня есть доступ ко всему набору наших файлов исходного кода. Каждый модуль является общей библиотекой. Некоторые из них связаны с исполняемым файлом, а другие загружаются через dlopen() – GMichael

ответ

0

Вы можете использовать sigaction(2) с NULL второго act аргумента и неустановленным NULL третьего oldact аргумента запроса (т.е. исследовать) обработку сигнала данного signum, первый аргумент к sigaction:

struct sigaction oldactst; 
memset (&oldactst, 0, sizeof(oldactst)); 
if (sigaction (signum, NULL, &oldactst))) { 
    perror("examining sigaction"); exit (EXIT_FAILURE); 
} 
// do something with oldactst 

Тогда, возможно, используйте отладчик или dladdr(3), чтобы преобразовать адрес в разумное имя .... Не забудьте связать все ваше приложение с -rdynamic (и, если возможно, скомпилируйте его с помощью -g, то есть с информацией об отладке) ...

signal(7) Читайте также, как я заметил ...

Смотрите также /proc/self/status или /proc/$PID/status (например, proc(5) ...)

+0

. Ваше предложение дает адрес вместо имени функции/метода, которое мне нужно. – GMichael

1
Is there any way to see/trace installing of those handlers during run time? 

Вы можете установить точку останова на функцию sigaction() и распечатать трассировку при достижении точки останова.

ADDED: как указано в комментариях, некоторый код может использовать функцию signal() для настройки обработчика сигнала, чтобы вы могли также проследить эту функцию.

+0

Сторонние библиотеки могут использовать старый 'signal (2)' для установки обработчиков сигналов ... –

+0

Я попытался установить точку останова для обоих вызовов. Не показывал ничего. – GMichael

+1

@Michael Попробуйте установить точку останова на 'main'. Когда он попадает, установите точки останова на 'signal' и' sigaction'. –

0

Мне удалось понять, что происходит, создавая собственные вызовы signal() и sigaction(). Они не делают ничего, кроме трассировки стека печати при вызове. Поскольку они появляются в моем коде, они затеняют реальные, и я вижу все места, где установлены обработчики сигналов. Я использовал семейство вызовов backtrace() для печати стека. Спасибо всем, кто помогал.

Смежные вопросы