关于Linux系统下错误“浮点数异常(核心已转储)”的分析
1.问题发现
有这样一段代码:
#include <stdio.h>
int main()
{
int a, b, num1, num2, temp;
printf("please input two numbers:\n");
scanf("%d,%d", &num1, &num2);
if(num1 > 0 && num2 > 0) (1)
{
a = num1;
b = num2;
temp = a%b;
}
while(b != 0) (2)
{
a = b;
b = temp;
temp = a%b;
}
printf("gong yue shu : %d\n", a);
printf("gong bei shu : %d\n", num1*num2/a);
return 0;
}
该代码输入任何数字的执行结果(如图1)都是“浮点数异常(核心已转储)”,刚刚见到这个问题让人感觉摸不着头绪,程序根本没有用到浮点数,怎么会报告浮点数异常;

图1.程序运行结果
2.问题分析
下面我们通过Linux自带调试工具Gdb来进行调试,观察程序的运行状况。在编译的是个加上“-g”选项,方便利用Gdb调试。

图2.编译和调试指令
程序编译没有错误,下面使用Gdb工具调试;在不知道问题产生根源的情况下,先在(1)处设置断点,全速运行;

图3.断点之前运行情况
从图3可见,进入断点前,程序运行正常;下面查看变量num1、num2的值。

图4.变量赋值情况
由图4可见,变量num1、num2的值正常读入。下面将断点设置在(2)处,全速运行。

图5.进入断点2前程序运行情况
由图4可见,进入while循环之前,程序正常运行。查看变量a、b赋值情况发现此时变量a、b均按照程序预期赋值。

图6.变量a、b赋值情况
下面开始单步运行。由图7可见,第一次循环结束变量a的值为4,b的值

图7.第一次循环执行情况
为2,temp的值为0;继续单步运行。从图8可以看出,在第二次进入循环执行

图8.第二次循环执行情况
语句“temp = a%b;”的时候出现了错误。分析变量值发现此时变量a的值为2,b的值为0,对0求余是没有意义的,语法不允许。到此,问题水落石出。
现在,我们编写测试代码对问题产生原因进行验证,代码如下:
#include <stdio.h>
int main(int argc , char *argv[])
{
int a=5,b=0;
printf("%d\n",a%b);
return 0;
}

图9.测试代码运行情况
由图9可见,该错误系求余运算符右边操作数为0值所致。如果把测试代码的“a%b”改为“a/b”,运行结果仍然是浮点数例外。求余运算和除法运算不允许右边的操作数为0值,我们在编写程序的时候需小心谨慎,注意程序的逻辑,避免之中错误的发生。问题代码系网上引用,其中辗转相除法的逻辑错误,此处不加讨论。
关于Linux系统下错误“浮点数异常(核心已转储)”的分析的更多相关文章
- Linux 下运行 C++ 程序出现 “段错误(核心已转储)”
Linux下写C++程序出现“段错误(核心已转储)”的问题: 段错误一般就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它 ...
- Linux下运行C++程序出现"段错误(核心已转储)"的原因
今天写程序出现了“段错误(核心已转储)"的问题,查了一下资料,加上自己的实践,总结了以下几个方面的原因. 1.内存访问出错 这类问题的典型代表就是数组越界. 2.非法内存访问 出现这类问题 ...
- Linux系统下到哪儿寻找硬件错误
Linux系统下到哪儿寻找硬件错误 当linux系统出现故障的时候,作为管理员首先要定位错误,现在linux有许多工具都能帮助用户寻找错误,要学会利用他们确定问题.这些工具包括dmesg. ...
- 深入理解linux系统下proc文件系统内容
深入理解linux系统下proc文件系统内容 内容摘要:Linux系统上的/proc目录是一种文件系统,即proc文件系统. Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它 ...
- 在Linux系统下运行微信Web开发者工具
微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折. 注:带 * 的步骤或文件为不确定是否管用的步骤或文件.本人系统为Linux ...
- Vi (Unix及Linux系统下标准的编辑器)VIM (Unix及类Unix系统文本编辑器)
Vi是Unix及Linux系统下标准的编辑器.学会它后,您将在Linux的世界里畅行无阻.基本上vi可以分为三种状态,分别是命令模式.插入模式,和底行模式. vi编辑器是所有Unix及Linux系统下 ...
- linux系统下的权限知识梳理
下面对linux系统下的有关权限操作命令进行了梳理总结,并配合简单实例进行说明.linux中除了常见的读(r).写(w).执行(x)权限以外,还有其他的一些特殊或隐藏权限,熟练掌握这些权限知识的使用, ...
- linux系统下修改文件夹目录权限
linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何 ...
- Linux系统下Apache2.4.17的安装过程
Linux系统下安装Apache Server2.4.17.还是先声明一下,Linux命令我不进行讲解,因为我不是讲Linux命令的.有需要注意的地方,我会上图,没什么值得的注意的地方,我就不上图了. ...
随机推荐
- Linux远程复制命令SCP
scp test.json savo@yourdomain.com:/usr/share/nginx/test # 以上命令需配置好ssh
- 高性能MySQL(一):基本数据类型
更多交流及资料,请加群 :
- vs2012 安装entity framework
1.安装vs2012 2.打开vs2012的工具下的扩展工具 3.搜索nuget,没安装的直接在线安装 4.安装好了NuGet,程序包管理器控制台 5.执行命令Install-Package Enti ...
- OC与Swift单例
OC: +(instancetype)shareNetworkTools{ static id instance; static dispatch_once_t onceToken; //onceTo ...
- POCO库——Foundation组件之日期时间DateTime
日期时间DateTime:内部提供多个设计计时器.日期.时区.时间戳等: Clock.h :Clock时钟计时类,_clock:Int64类型时钟值,CLOCKVAL_MIN.CLOCKVAL_MAX ...
- Ubuntu——apt && dpkg参考
一.apt apt-cache search # ------(package 搜索包) apt-cache show #------(package 获取包的相关信息,如说明.大小.版本等) sud ...
- CURL 模拟http提交
1:CURL模拟get提交 private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETUR ...
- 【Android】1.开发环境搭建
一.配置JAVA环境变量 第一步:先右键计算机-->属性-->高级系统设置-->环境变量-->新建 第二步:新建需要建立三个环境变量,其实两个就可以,建立JAVA_HOME只是 ...
- java 聊天猜拳机器人
2016-12-06本随笔记录第一次制作经过,感谢各位大神指导. 工具:eclipse;JAVA JDK; 语言:java 时间:2016.11.23 作者:潇洒鸿图 地址:http://www.cn ...
- OX中修改文件名
右击文件,显示简介,名称与扩展名