2013-07-31 111 views
2

核心轉儲我有一個QEMU的KVM過程可疑核心轉儲與SIGFPE:與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_timedoubleNANOSECONDS_PER_SECOND(在下面的gdb輸出的值)是一個宏:

#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。

+0

什麼是'elapsed_time'類型和值? –

+0

double,919718,如問題描述中更新的那樣。 – FamZheng

+0

鄭您在信號故障時確保--wait –

回答

4

SIGFPE在你的代碼是不是由於零,但由於一些原因如下劃分:

FPE_FLTOVF_TRAP:浮動溢出陷阱。
FPE_FLTUND_TRAP:浮動下溢陷阱。 (上浮動下溢的捕獲通常不啓用。)

Macro: int SIGFPE:

SIGFPE信號報告致命算術誤差。儘管 這個名稱是從「浮點異常」派生的,但該信號實際上覆蓋了所有算術錯誤,包括除以零和溢出。 如果程序將整數數據存儲在某個位置,然後在浮點運算中使用該位置,則這通常會導致「無效操作」 例外,因爲處理器無法將該數據識別爲浮點數 。

實際浮點異常是一個複雜的主題,因爲 存在許多類型的意外細微差別,而 SIGFPE信號不區分它們。 IEEE標準 二進制浮點運算(ANSI/IEEE標準754-1985)規定 各種浮點異常,需要符合計算機 系統報告其發生。然而,這個標準並不規定如何報告異常,或者控制操作系統可以爲程序員提供什麼類型的處理和控制。

因爲:
NANOSECONDS_PER_SECOND = 1000000000.0elapsed_time = 919718所以elapsed_time /= (NANOSECONDS_PER_SECOND);=>919718/100 0000 000.0 == 0.0000919718,我相信這會導致Floating underflow trap因此SIGFPF的。

浮動溢水捕集器不能的情況下,因爲操作是鴻溝。