Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何调试sigfpe被零除时不';不会发生_C_Ruby_Assembly_Gdb_Sigfpe - Fatal编程技术网

C 如何调试sigfpe被零除时不';不会发生

C 如何调试sigfpe被零除时不';不会发生,c,ruby,assembly,gdb,sigfpe,C,Ruby,Assembly,Gdb,Sigfpe,我试图在--a-like-arch上使用O0-ggdb3编译ruby,但遇到了一个奇怪的SIGFPE错误: (gdb) bt #0 0x000002000544463c in __divlu () from /lib/libc.so.6.1 #1 0x0000020001fe6808 in distance_multiply ( d=18446744073709551615, m=1) at regcomp.c:109 #2 0x0000020001ff5a44 in op

我试图在--a-like-arch上使用
O0-ggdb3
编译ruby,但遇到了一个奇怪的SIGFPE错误:

(gdb) bt 
#0  0x000002000544463c in __divlu ()
   from /lib/libc.so.6.1
#1  0x0000020001fe6808 in distance_multiply (
    d=18446744073709551615, m=1) at regcomp.c:109
#2  0x0000020001ff5a44 in optimize_node_left (
    node=0x121f43be0, opt=0x2000db31480,
    env=0x2000db31678) at regcomp.c:5247
#3  0x0000020001ff4b6c in optimize_node_left (
    node=0x122387f60, opt=0x2000db317c0,
    env=0x2000db319b8) at regcomp.c:4982
#4  0x0000020001ff62c4 in set_optimize_info_from_tree (node=0x122387f60, reg=0x12216df60,
    scan_env=0x2000db31a20) at regcomp.c:5417
#5  0x0000020001ff6d64 in onig_compile_ruby (
    reg=0x12216df60,
    pattern=0x121c021e0 "\\A([^:\\s]*)(?:::([^:\\s]*))?\\s*=(.*)\\z", pattern_end=0x121c02205 "",
    einfo=0x2000db31bc0,
    sourcefile=0x12109eea0 "-", sourceline=90)
    at regcomp.c:5854
#6  0x0000020001fd9ef4 in onig_new_with_source (
    reg=0x2000db31bd8,
    pattern=0x121c021e0 "\\A([^:\\s]*)(?:::([^:\\s]*))?\\s*=(.*)\\z", pattern_end=0x121c02205 "",
    option=0, enc=0x12108c840,
    syntax=0x2000213fef8 <OnigSyntaxRuby>,
    einfo=0x2000db31bc0,
    sourcefile=0x12109eea0 "-", sourceline=90)
    at re.c:842
#7  0x0000020001fd9fe8 in make_regexp (
    s=0x121c021e0 "\\A([^:\\s]*)(?:::([^:\\s]*))?\\s*=(.*)\\z", len=37, enc=0x12108c840, flags=0,
    err=0x2000db31d20 "",
<tinue, or q <return> to quit---
如您所见,如果m为零,它将直接返回,因此被零偏离的
sigfpe将永远不会发生。我还尝试在
printf
的帮助下转储
d
m
的值:

静态电离距离
距离乘以(仅距离d,整数m)
{
fprintf(标准,“\n\nd=%zu,m=%d,ONIG_INFINITE_DISTANCE=%d”,d,m,ONIG_INFINITE_DISTA\
(NCE);
如果(m==0)
{
fprintf(stderr,“m==0,应返回\n”);
返回0;
}
if(d
输出:

#+BEGIN_SRC
d = 1, m = 0, ONIG_INFINITE_DISTANCE = -1    m == 0, should return


d = 1, m = 1, ONIG_INFINITE_DISTANCE = -1    d < ONIG_INFINITE_DISTANCE / m
 22% [198/871]  ext/psych/lib/psych.rb

d = 1, m = 1, ONIG_INFINITE_DISTANCE = -1
Thread 1 "ruby2.5" received signal SIGFPE, Arithmetic exception.
0x000002000209263c in __divlu () from /lib/libc.so.6.1
#+END_SRC

#+BEGIN_SRC
d = 1, m = 0, ONIG_INFINITE_DISTANCE = -1    m == 0, should return


d = 1, m = 2, ONIG_INFINITE_DISTANCE = -1    d < ONIG_INFINITE_DISTANCE / m
 43% [378/871]  lib/net/http.rb

d = 1, m = 1, ONIG_INFINITE_DISTANCE = -1
Thread 1 "ruby2.5" received signal SIGFPE, Arithmetic exception.
0x0000020004bbc63c in __divlu () from /lib/libc.so.6.1
#+END_SRC

#+BEGIN_SRC
d = 1, m = 0, ONIG_INFINITE_DISTANCE = -1    m == 0, should return


d = 1, m = 1, ONIG_INFINITE_DISTANCE = -1    d < ONIG_INFINITE_DISTANCE / m
 22% [198/871]  ext/psych/lib/psych.rb

d = 1, m = 1, ONIG_INFINITE_DISTANCE = -1
Thread 1 "ruby2.5" received signal SIGFPE, Arithmetic exception.
0x000002000d9f063c in __divlu () from /lib/libc.so.6.1
#+END_SRC

#+BEGIN_SRC
d = 1, m = 0, ONIG_INFINITE_DISTANCE = -1    m == 0, should return


d = 1, m = 1, ONIG_INFINITE_DISTANCE = -1    d < ONIG_INFINITE_DISTANCE / m
 22% [198/871]  ext/psych/lib/psych.rb

d = 1, m = 1, ONIG_INFINITE_DISTANCE = -1
Thread 1 "ruby2.5" received signal SIGFPE, Arithmetic exception.
0x0000020001abc63c in __divlu () from /lib/libc.so.6.1
#+END_SRC

#+BEGIN_SRC
d = 1, m = 0, ONIG_INFINITE_DISTANCE = -1    m == 0, should return


d = 1, m = 1, ONIG_INFINITE_DISTANCE = -1    d < ONIG_INFINITE_DISTANCE / m
 22% [198/871]  ext/psych/lib/psych.rb

d = 1, m = 1, ONIG_INFINITE_DISTANCE = -1
Thread 1 "ruby2.5" received signal SIGFPE, Arithmetic exception.
0x0000020005ce263c in __divlu () from /lib/libc.so.6.1
#+END_SRC

#+BEGIN_SRC
d = 23, m = 1, ONIG_INFINITE_DISTANCE = -1    d < ONIG_INFINITE_DISTANCE / m


d = 24, m = 1, ONIG_INFINITE_DISTANCE = -1    d < ONIG_INFINITE_DISTANCE / m


d = 1, m = 0, ONIG_INFINITE_DISTANCE = -1    m == 0, should return
 37% [329/871]  lib/getoptlong.rb

d = 1, m = 1, ONIG_INFINITE_DISTANCE = -1
Thread 1 "ruby2.5" received signal SIGFPE, Arithmetic exception.
0x0000020000ba863c in __divlu () from /lib/libc.so.6.1
(gdb)
#+END_SRC


请注意,有符号整数上的
INT\u MIN/-1
也会在2的补码机器上产生SIGFPE,这会在除法溢出(例如x86)时引发算术异常。但是看起来您使用的是一些宽typedef
OnigDistance
,这在GCC帮助函数中是错误的;在这个模糊的ISA上,可能只是因为大输入而出现问题?至少在调试案例中,在零检查之前有一个
ONIG_INFINITE_DISTANCE/m
。我已经编辑了这个问题,并添加了遗漏的定义/typedef@PeterCordesI。我将首先分解uu divlu,以查看它的错误发生在什么指令上。您可能会发现它要么被0除,要么有一个除法溢出,需要像Peter Cordes说的那样进行修复。考虑到Sunway指令集未被记录,之后您可能需要自己处理。请注意,有符号整数上的
INT_MIN/-1
也会在2的补码机上产生SIGFPE,该补码机会在除法溢出(例如x86)时引发算术异常。但是看起来您使用的是一些宽typedef
OnigDistance
,这在GCC帮助函数中是错误的;在这个模糊的ISA上,可能只是因为大输入而出现问题?至少在调试案例中,在零检查之前有一个
ONIG_INFINITE_DISTANCE/m
。我已经编辑了这个问题,并添加了遗漏的定义/typedef@PeterCordesI。我将首先分解uu divlu,以查看它的错误发生在什么指令上。您可能会发现它要么被0除,要么有一个除法溢出,需要像Peter Cordes说的那样进行修复。鉴于Sunway指令集未记录在案,此后您可能需要自行处理。