2

qemu-kvm プロセスが疑わしい SIGFPE でコアダンプされています。

Program terminated with signal 8, Arithmetic exception.
#0  bdrv_exceed_io_limits (bs=0x7f75916b7270, is_write=false, nb_sectors=1)
   at /usr/src/debug/qemu-kvm-0.12.1.2/block.c:3730
3730        elapsed_time  /= (NANOSECONDS_PER_SECOND);

elapsed_timeは(以下のgdbdouble出力の値) でNANOSECONDS_PER_SECOND、マクロは次のとおりです。

#define NANOSECONDS_PER_SECOND  1000000000.0

SIGFPE を引き起こす理由が思いつきません。どんな手掛かり?

シナリオ: RHEL-6.5 をホストとして使用し、Windows ゲストを起動しようとしています。同じコマンドで着実に再現可能です。

完全なバックトレース:

(gdb) bt
#0  bdrv_exceed_io_limits (bs=0x7ffff86f9270, is_write=false, nb_sectors=1) at /usr/src/debug/qemu-kvm-0.12.1.2/block.c:3730
#1  bdrv_io_limits_intercept (bs=0x7ffff86f9270, is_write=false, nb_sectors=1) at /usr/src/debug/qemu-kvm-0.12.1.2/block.c:181
#2  0x00007ffff7e0bf6d in bdrv_co_do_readv (bs=0x7ffff86f9270, sector_num=0, nb_sectors=1, qiov=0x7fffe8000ab8, flags=<value optimized out>)
    at /usr/src/debug/qemu-kvm-0.12.1.2/block.c:2136
#3  0x00007ffff7e0c293 in bdrv_co_do_rw (opaque=0x7fffe8000b00) at /usr/src/debug/qemu-kvm-0.12.1.2/block.c:3880
#4  0x00007ffff7e125eb in coroutine_trampoline (i0=<value optimized out>, i1=<value optimized out>)
    at /usr/src/debug/qemu-kvm-0.12.1.2/coroutine-ucontext.c:129
#5  0x00007ffff5718ba0 in ?? () from /lib64/libc.so.6
#6  0x00007fffffffbf60 in ?? ()
#7  0x0000000000000000 in ?? ()

(gdb) disass
   0x00007ffff7e0b6ae <+190>:   mov    0x8a0(%rbx),%rax
   0x00007ffff7e0b6b5 <+197>:   test   %rax,%rax
=> 0x00007ffff7e0b6b8 <+200>:   divsd  0x170660(%rip),%xmm0        # 0x7ffff7f7bd20
   0x00007ffff7e0b6c0 <+208>:   je     0x7ffff7e0b950 <bdrv_io_limits_intercept+864>
   0x00007ffff7e0b6c6 <+214>:   mov    0x888(%rbx),%rsi

(gdb) x/gf 0x7ffff7f7bd20
0x7ffff7f7bd20: 1000000000

(gdb) p elapsed_time
$3 = 919718

(gdb) p $_siginfo
$1 = {si_signo = 8, si_errno = 0, si_code = 6, _sifields = {_pad = {-136186690, 32767, 4244976, 0, -560757824, 32767, -
    -560757344, 32767, 0, 0, 0, 0, 0, 0, 34884976, 0, -136186690, 32767, 34884976, 0, 4258127, 0, 0, 0, -55876128, 3265
    -136186690, si_uid = 32767}, _timer = {si_tid = -136186690, si_overrun = 32767, si_sigval = {sival_int = 4244976, s
    _rt = {si_pid = -136186690, si_uid = 32767, si_sigval = {sival_int = 4244976, sival_ptr = 0x40c5f0}}, _sigchld = {s
      si_uid = 32767, si_status = 4244976, si_utime = -2408436515056123904, si_stime = -584917379700457473}, _sigfault 
    0x7ffff7e1f4be}, _sigpoll = {si_band = 140737352168638, si_fd = 4244976}}}

divsdでは、この指示のどこが間違っているのでしょうか? それをデバッグする方法について何か提案はありますか?

自分で答えてください:これは mxcsr を誤って誤った値に設定するカーネルのバグです。ビットが適切にマスクされていない場合、Linux カーネルは SIGFPE コード INEXACT をトリガーします。

4

2 に答える 2

4

コード内の SIGFPE は、ゼロで除算するためではなく、次の理由のいくつかによるものです。

FPE_FLTOVF_TRAP: フローティング オーバーフロー トラップ。
FPE_FLTUND_TRAP: フローティング アンダーフロー トラップ。(フローティング アンダーフローのトラップは、通常は有効になっていません。)

マクロ: int SIGFPE:

SIGFPE シグナルは、致命的な算術エラーを報告します。名前は「浮動小数点例外」に由来しますが、この信号は実際には、ゼロによる除算やオーバーフローを含むすべての算術エラーをカバーします。プログラムが浮動小数点演算で使用される場所に整数データを格納すると、プロセッサがデータを浮動小数点数として認識できないため、「無効な演算」例外が発生することがよくあります。

実際の浮動小数点例外は、微妙に異なる意味を持つ多くの種類の例外があり、SIGFPE シグナルはそれらを区別しないため、複雑な問題です。2 進浮動小数点演算の IEEE 標準 (ANSI/IEEE Std 754-1985) では、さまざまな浮動小数点例外が定義されており、適合するコンピューター システムがその発生を報告する必要があります。ただし、この標準では、例外の報告方法や、オペレーティング システムがプログラマに提供できる処理と制御の種類は指定されていません。

= and
NANOSECONDS_PER_SECOND= so = > ==であるため、これが SIGFPF の原因であると確信しています。1000000000.0elapsed_time919718elapsed_time /= (NANOSECONDS_PER_SECOND); 919718 / 100 0000 000.00.0000919718Floating underflow trap

演算が除算であるため、フローティング オーバーフロー トラップは当てはまりません。

于 2013-07-31T04:47:02.070 に答える
1

SIGFPE は、それを引き起こした命令の後、しばらくたつまで必ずしも見られるとは限りません。もちろん、これは混乱を招きます。

https://stackoverflow.com/a/2219339/1442050を参照してください

于 2013-07-31T04:35:50.323 に答える