Доброго дня всем.
Есть httpd сервер (обычный Apache), к нему написан модуль, который выпадает в SigSegV. Мне необходимо узнать где это происходит, и вот какое решение я пытался воплотить:
Я переопределяю обработчик сигнала SigSegV, и в свой функции я делаю vfork(), и далее в новом процессе вызываю gdb, который делает attach к родителю, и делает gcore.
Далее, я этот core файл начинаю использовать:
$ gdb httpd -c 5861.1Hc3Ks-0001WX-gC.5861
....
Loaded symbols for /home/prapor/programs/mca/libs/xalan/lib/libxalanMsg.so.110
#0 0x00002af2e04ffa40 in wait () from /lib/libpthread.so.0
(gdb) bt
#0 0x00002af2e04ffa40 in wait () from /lib/libpthread.so.0
#1 0x00002af2e5edc197 in Signal_SIGSEGV (sig=<value optimized out>) at mod_pm.cpp:51
#2 0x00002af2e073f940 in killpg () from /lib/libc.so.6
#3 0x0000000000000000 in ?? ()
(gdb)
И я не вижу тот стек, который я ожидал увидеть. Ведь, как я понимаю, родитель работал, стек у него должен быть не маленький, а тут ноль.
Я уже проделывал таку штуку на работающем апаче - видел нормальный стек исполнения. Но здесь что-то не то. Ведь смотрите: если обработчик сигнала просто завершит свое выполнение (return;), то процесс будет продолжать выполнять свой код. Так а как же он вернется в этот код, если стек пуст!
Вот снимок стека работающего апача:
(gdb) bt
#0 0x00002af2e07c8363 in select () from /lib/libc.so.6
#1 0x00002af2e00a8115 in apr_sleep (t=<value optimized out>) at time.c:246
#2 0x000000000043b4a5 in ap_wait_or_timeout (status=0x7fffcb10b2bc, exitcode=0x7fffcb10b2b8, ret=0x7fffcb10b290,
p=0x565138) at mpm_common.c:345
#3 0x00000000004448e7 in ap_mpm_run (_pconf=0x16f8, plog=<value optimized out>, s=0x2) at worker.c:1570
#4 0x0000000000420b01 in main (argc=1, argv=0x7fffcb10b488) at main.c:717
(gdb)
Но не то что я видел !
Заранее спасибо за советы.