Я отлаживаю основной файл, в котором получил нарушение сегмента. Согласно файлу ядра, это происходит, когда программа пытается получить доступ к действительному разделу памяти. У нас есть журнал, который показывает, что ранее был звонок на madvise(addr,size,MADV_DONTNEED)
, где этот адрес находился в заданном диапазоне. Это означает, что он, вероятно, был заменен во время вызова.
Кроме того, при отладке файла ядра, если мы делаем дамп структуры $_siginfo
, он показывает, что si_signo = 11
и si_addr = 1234
, где 1234
- это pid процесса. В настоящее время мы подозреваем, что мы получили SIGBUS, и кто-то зарегистрировал обработчик, который вызывает SEGV.
Итак, два вопроса: - во-первых, возможно ли в GDB просмотреть стек обработчика сигнала ? У меня сложилось впечатление, что обработчик сигнала будет использовать стек процессов, но необработанный дамп пространства стека не показывает никаких доказательств того, что это так (я подозреваю, что кто-то явно зарегистрировал стек обработчика сигналов в этом случае),
И, во-вторых, есть ли способ в GDB определить из файла ядра, какой обработчик сигнала зарегистрирован для определенного сигнала? info signal
не говорит мне об этом.
----- РЕДАКТИРОВАТЬ ----------
некоторые дополнительные сведения: это приложение на пользовательском пространстве arm32 bit , GDB показывает:
(gdb) list
234 port_get_port_info (handle_t handle)
235 {
236 port_info_t *port_info;
237 int rc;
238
239 rc = id_to_ctx(port_db, handle, (void **)&port_info);
(где 239 - строка сбоя - обратите внимание, что port_db - это глобальный объект на странице, который предполагалось заменить, поэтому мы ожидаем, что здесь SIGBUS)
(gdb) info inferior
Num Description Executable
* 1 process 9820 /home/dev/ws1/fuzzy_bunny
(gdb) p $_siginfo
$1 = {
si_signo = 11,
si_errno = 0,
si_code = 0,
_sifields = {
_pad = {9820, 0 <repeats 28 times>},
...
_sigchld = {
si_pid = 9820,
si_uid = 0,
si_status = 0,
si_utime = 0,
si_stime = 0
},
_sigfault = {
si_addr = 0x265c
},
}
}
И:
(gdb) bt 1
#0 0xf76e041c in port_get_port_info (handle=4278190136) at /home/dev/ws1/code/fuzzy_bunny/src/port_api.c:239
(More stack frames follow...)
Таким образом, обратная трассировка не показывает обработчик сигнала, что мне и нужно увидеть в данный момент.
(gdb) info registers
r0 0x22a564 2270564
r1 0xff000038 4278190136
r2 0xee007574 3993007476
r3 0x0 0
r4 0x0 0
r5 0xee007758 3993007960
r6 0xff000038 4278190136
r7 0x6 6
r8 0xee007760 3993007968
r9 0xee007758 3993007960
r10 0xee007608 3993007624
r11 0x2364418 37110808
r12 0xf78da92c 4153256236
sp 0xee007568 0xee007568
lr 0xf76dc37c -143801476
pc 0xf76e041c 0xf76e041c <port_get_sb+60>
cpsr 0x8f0010 9371664
fpscr 0x80000010 -2147483632
и asm:
x0xf76e0414 <port_get_sb+52> ldr r0, [pc, #196] ; 0xf76e04e0 <port_get_sb+256> x
x0xf76e0418 <port_get_sb+56> add r2, sp, #12 x
b+>x0xf76e041c <port_get_sb+60> ldr r0, [pc, r0] x
x0xf76e0420 <port_get_sb+64> bl 0xf76cc8b4 <id_to_ctx@plt> x
Опять же, я ищу способ увидеть, что происходит в обработчике сигналов из GDB ...