我目前正面临着我的团队正在处理的大型复杂项目中遇到过的最严重的错误之一。我们使用 C++ 作为编程语言,目前使用 Visual Studio 进行开发,尽管最终产品旨在跨平台运行。
漏洞:
我们的系统中存在一个错误,它会在看似随机的执行点触发崩溃。崩溃的原因通常是地址的读取访问冲突,每次执行程序时地址都会发生变化。有时我们也会遇到堆损坏错误。调用堆栈将我们引向代码库中的变化点,并且很少引向某些外部库(在我们的例子中是 Lua),而错误显然并不存在。
似乎这个错误在过去 4 个月内一直在发展。那段时间之前,大致上,我的一些团队成员看到前端程序崩溃的方式和位置与现在发生的情况非常相似。
更多细节:
我们的代码库大约有 800,000 行纯 C++(不包括注释)大,开发历时 3 年。 当前项目的重量约为 300K。我们使用过多的单元测试和其他方法来在错误发生之前将其消除,例如断言、智能指针等。
我和其他人已经尝试查找此错误 2 个多星期了。对我来说,这不仅仅是一场噩梦。在如此复杂的项目中,面对现在的复杂性,即使是良好的旧 printf 调试似乎也失败了。
我的问题
我们在这里面临什么样的错误?这甚至有一个名字吗?这种错误在其他大型项目中是否经常出现?
在使用各种实用程序、各种平台和各种build设置进行了 2 周无果调试后,我们可以做些什么来找到并消除它?
(我之前的问题已经结束,所以这次我尝试用更多的细节来更好地表述它,链接:https://stackoverflow.com/questions/7154645/how-is-this-kind-of-bug-called)
最佳答案
您描述的症状是堆损坏的典型症状(并非所有堆损坏都报告为带有错误消息!)。您将需要审核程序中所有对象的生命周期;确保你没有两次释放东西,或者在释放它们之后使用它们,并确保你没有溢出任何缓冲区。您可能想借此机会使用诸如 std::smart_ptr(或 boost::smart_ptr)之类的东西来自动化部分堆管理。
如果您使用的是 Linux 或 Mac 操作系统,请尝试在 valgrind 下运行您的程序- 它将检测到许多堆和堆栈损坏错误。在 Windows 上,使用 application verifier ;它可以帮助使错误导致崩溃的时间更接近真正发生的时间点。
如果您正在使用线程,则导致堆损坏的竞争条件是另一种可能性。还要审核您的锁定机制。
如果您可以轻松地重现此错误,并且拥有适当的源代码控制系统,请考虑使用二分法来确定引入它的确切时间。也就是说,对您的源代码历史执行二进制搜索以找到带有错误的第一个提交。 Git 有一个工具可以自动执行此操作 - git-bisect - 如果您还没有使用 git,可以将存储库的拷贝导入 git 以运行此工具。
此外,看看您是否可以禁用程序的某些部分(完全阻止调用有问题的代码)以缩小问题范围。请注意,这可能有误报 - 如果您禁用模块 X 并且它停止崩溃,则可能意味着模块 X 正在破坏堆,或者它可能意味着模块 W 破坏了堆而模块 X 恰好善于注意到它.
关于c++ - 描述和发现导致看似随机崩溃的状态破坏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7154862/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我