首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在大型项目中找到除法为零

在大型项目中找到除法为零
EN

Stack Overflow用户
提问于 2010-02-01 23:12:21
回答 10查看 2.7K关注 0票数 9

最近,我们的大项目开始在未处理的除法上崩溃。最近的代码似乎没有包含任何可能的元素,因此它可能是影响旧代码的新数据集。问题是代码库非常大,并且运行在没有调试访问权限的嵌入式设备上(调试是由串行控制台上的大量printf()完成的,没有用于该设备的gdb,即使有,使用调试符号编译的二进制代码也不适合)。

最可行的方法可能是找到所有除法运算(它们相对较少),并分析每个除法运算周围的代码,看看是否有任何除数变量没有受到保护。

那么问题要么是如何在一个大的(大约200个文件,一些大的) C++项目中找到所有除法运算,要么是如果你有更好的想法来定位错误,请给出它们。

额外信息:项目运行在嵌入式ARM9上,这是一个小型的定制Linux发行版,与Cygwin/Windows交叉编译,集成开发环境是Eclipse,但也有Cygwin,有所有各自的优点。问题是该项目是非常特定于硬件的,只有在满负荷运行时才会发生崩溃,所有基本的互连模块都处于活动状态。受限制的“故障模式”,其中只有裸骨骼是活动的,不会创建它们。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-02-01 23:14:10

使用自定义的grep搜索,查找所有部门应该不难。您可以很容易地将这种用法与C++中/%字符的其他用法区分开来。

此外,如果您知道要划分的内容,则可以全局重载/%操作符,以获得__FILE____LINE__通知断言。如果使用makefile,那么在不接触代码的情况下将自定义操作符代码包含在所有链接文件中应该不难。

票数 6
EN

Stack Overflow用户

发布于 2010-02-01 23:19:22

我认为最直接的步骤是尝试捕获未处理的异常,并生成转储或打印堆栈信息或类似信息。

Take a look at this question,或者在谷歌中搜索与您的特定环境中的异常捕获相关的信息。

顺便说一句,我认为这种划分可能是由于调用外部库而发生的,因此您不能100%确定仅仅通过对代码进行贪婪处理就能找到罪魁祸首。

票数 8
EN

Stack Overflow用户

发布于 2010-02-02 00:00:41

如果我没记错的话,ARM9没有硬件除法,所以它将在编译器执行除法时的函数调用中实现。

查看您的工具集是否以与ARM's toolset does相同的方式实现除以零的处理(它可能至少执行类似的操作)。如果是这样的话,您可以安装一个在问题发生时调用的处理程序,并且可以printf()寄存器和堆栈,以便您可以确定问题发生的位置。一种可能的类似替代方案是,您的小型Linux发行版抛出了一个您可以捕捉到的信号。

我不确定您是如何获得被零除的信息的,但如果是因为运行时发出了一条消息,那么您始终可以选择找出在运行时中处理该消息的位置,并将其替换为您自己的更具信息性的消息。然而,我猜还有一种更“架构化”的方式让你的代码运行(信号处理程序或ARM的技术)。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2177619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档