关于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命令的.有需要注意的地方,我会上图,没什么值得的注意的地方,我就不上图了. ...
随机推荐
- Typescript基础类型
1.布尔值__boolean 2.数字__number----除了支持十进制和十六进制字面量,Typescript还支持ECMAScript 2015中引入的二进制和八进制字面量. 3.字符串__st ...
- 【iBeacon】iBeacon前沿初探技术备忘
iBeacon是工作在蓝牙4.0(BLE)硬件下的一种协议,属于蓝牙4.0广播协议的一种,通过该协议和一个蓝牙模块可以实现非接触的身份识别.位置检测等. How does BLE communicat ...
- 关于httpd服务的安装、配置
httpd是Apache超文本传输协议(HTTP)服务器的主程序.通常,httpd不应该被直接调用,而应该在linux系统中由 apachectl 调用.接下来我们将了解有关httpd服务的安装与配置 ...
- oracleDBA-D1
一.数据库备份 1.测试系统环境:win10 64位 企业版 测试数据库环境:oracle11gR2 2.步骤: I.首先以sysdba权限用户登录数据库,命令: SQL> connect 超 ...
- CMS系统存储路径
CMS系统特点:前后端分离 index.html 首页文件index.php 管理后台的页面 api文件夹: 提供的接口 caches文件夹: 缓存文件 html文件夹: 生成的静态页面 phpcm ...
- MySQL延迟复制--percona-toolkit和MASTER TO MASTER_DELAY
为了数据的安全,有的时候数据库需要延迟备份,这里说下两种延迟备份的方法. 一.借助工具. 实现环境: 192.168.189.143 (mysql主库) 192.168.189.144 (mysql备 ...
- CentOS系统常用基本命令&Centos 7 命令变化
一:查看cpu信息more /proc/cpuinfo | grep "model name" grep "model name" /proc/cpuinfo ...
- 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】
一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...
- [UWP]使用AdaptiveTrigger实现自适应布局
这篇博客将介绍如何在UWP开发中使用AdaptiveTrigger实现自适应布局. 场景1:窗体宽度大于800时,窗体背景色为绿色,窗体在0到800之间为蓝色. XAML Code: <Grid ...
- Android 笔记 文件存取 day5
针对文件的存取 package com.example.file01; import com.example.service.FileService; import android.app.Activ ...