Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

SIGFPE / signal

07.06.12 14:42
Re: SIGFPE / signal
 
evgher постоялец
evgher
в ответ AlexOtt 05.06.12 20:45
Что-то у меня многое не клеется. Например у нас "инструкция": b1 = b1/0.0 - 1e-300*1e-300 (внизу в дисасемблированном виде),
в которой сразу несколько "FPE". При исполнении этой строки "program counter" должен перейти с адреса main+0x004e: на адрес main+0x007b:
после обработки "exception_handler". Разница между адресами соответствует 31, т. е. надо сделать прыжок в коде примерно таким образом:
При инструкции b1 = b1/0.0 разница адресов соответсвует 15-ти, т. е. это число постоянно меняется.
Существует какая либо возможность узнавать при исполнении программы, когда начинается следующая инструкция?
В ответ на:

void sigfpe_handler(int signo, siginfo_t *si, void *MainContext)
{
ucontext_t *pMainContext = @context von main
ucontext_t *pHandlerContext = @context von handler

switch(si->si_code)
{
case FPE_INTDIV: ....
....
case FPE_FLTDIV: puts("floating point divide by zero");
pMainContext->uc_mcontext.gregs[REG_RIP] +=31;
break;
case FPE_FLTOVF: ....
....
}
swapcontextp(pHandlerContext, pMainContext);

}
[цитата/]
....
[цитата]
143 printf("00: b1: %f; b2: %f\n",b1,b2);
0x00000000004009f6: main+0x0026: cvtss2sd 0xfffffffffffffff8(%rbp),%xmm2
0x00000000004009fb: main+0x002b: cvtss2sd 0xfffffffffffffff4(%rbp),%xmm0
0x0000000000400a00: main+0x0030: movsd %xmm0,%xmm1
0x0000000000400a04: main+0x0034: movsd %xmm2,%xmm0
0x0000000000400a08: main+0x0038: movq $_lib_version+0x1fc,%rdi
0x0000000000400a0f: main+0x003f: movl $0x0000000000000002,%eax
0x0000000000400a14: main+0x0044: call 0x00000000004004cc in PLT [ 0x4004cc, .-0x548 ]
0x0000000000400a19: main+0x0049: movl $0x0000000000000000,%eax
144 b1 = b1/0.0 - 1e-300*1e-300;
0x0000000000400a1e: main+0x004e: cvtss2sd 0xfffffffffffffff8(%rbp),%xmm3
0x0000000000400a23: main+0x0053: divsd _lib_version+0x14,%xmm3
0x0000000000400a2c: main+0x005c: movsd _lib_version+0x1c,%xmm2
0x0000000000400a35: main+0x0065: mulsd _lib_version+0x1c,%xmm2
0x0000000000400a3e: main+0x006e: subsd %xmm2,%xmm3
0x0000000000400a42: main+0x0072: cvtsd2ss %xmm3,%xmm2
0x0000000000400a46: main+0x0076: movss %xmm2,0xfffffffffffffff8(%rbp)
145 printf("01: b1: %f; b2: %f\n",b1,b2);
0x0000000000400a4b: main+0x007b: cvtss2sd 0xfffffffffffffff8(%rbp),%xmm3
0x0000000000400a50: main+0x0080: cvtss2sd 0xfffffffffffffff4(%rbp),%xmm2
0x0000000000400a55: main+0x0085: movsd %xmm2,%xmm1
0x0000000000400a59: main+0x0089: movsd %xmm3,%xmm0
0x0000000000400a5d: main+0x008d: movq $_lib_version+0x214,%rdi
0x0000000000400a64: main+0x0094: movl $0x0000000000000002,%eax
0x0000000000400a69: main+0x0099: call 0x00000000004004cc in PLT [ 0x4004cc, .-0x59d ]
0x0000000000400a6e: main+0x009e: movl $0x0000000000000000,%eax

 

Перейти на