当前位置: 首页 > news >正文

网站开发要用多少钱官方网站建设的公司

网站开发要用多少钱,官方网站建设的公司,免费域名网站查询,兰州市政建设集团网站目录 1、问题说明 2、从Visual Studio输出窗口中找到了线索#xff0c;发生了Stack Overflow线程栈溢出的异常 3、发生Stack Overflow线程栈溢出的原因分析 4、线程占用的栈空间大小说明 5、引发线程栈溢出的常见原因和场景总结 6、在问题函数入口处添加return语句…目录 1、问题说明 2、从Visual Studio输出窗口中找到了线索发生了Stack Overflow线程栈溢出的异常 3、发生Stack Overflow线程栈溢出的原因分析 4、线程占用的栈空间大小说明 5、引发线程栈溢出的常见原因和场景总结 6、在问题函数入口处添加return语句在Debug下运行还是会发生线程栈溢出异常 7、在问题函数入口处添加return到release下运行就不报线程栈溢出的异常了 8、如何查看函数入口处分配栈内存的汇编代码 9、最后 C软件异常排查从入门到精通系列教程专栏文章列表欢迎订阅持续更新...https://blog.csdn.net/chenlycly/article/details/125529931C/C实战进阶已更新到380多篇持续更新中...https://blog.csdn.net/chenlycly/category_11931267.htmlVC常用功能开发汇总专栏文章列表欢迎订阅持续更新...https://blog.csdn.net/chenlycly/article/details/124272585Windows C 软件开发从入门到精通专栏文章持续更新中...https://blog.csdn.net/chenlycly/category_12695902.htmlC软件分析工具从入门到精通案例集锦专栏文章持续更新中...https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术专栏文章持续更新中...https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享专栏文章持续更新中...https://blog.csdn.net/chenlycly/category_2276111.html       今天通过项目中遇到的一个线程栈溢出的实例详细讲解线程栈溢出问题的排查过程以及涉及的诸多细节以供大家借鉴或参考。通过Stack Overflow线程栈溢出的问题实例详解C程序线程栈溢出的诸多细节 1、问题说明 前段时间同事那边的代码出了问题他为了实现某个新需求在现有的代码中添加了一个业务消息底层的业务模块将消息抛给上层模块在上层模块中添加了该消息的响应函数去处理该消息编译代码后运行程序就直接闪退了。 同事排查分析了很久始终找不到问题于是找到我让我帮忙分析一下。他说将新加的消息处理函数注释掉就不会有崩溃放开代码后崩溃就是必现的。基本可以确定是新加的消息处理函数有问题但同事一直没找到原因。 2、从Visual Studio输出窗口中找到了线索发生了Stack Overflow线程栈溢出的异常 我到同事那边后他复现了问题打开函数调用堆栈页面看程序崩溃在一个不相关的模块中。从现有的堆栈看不到出问题的接口。切换到Output输出窗口中看到了输出窗口的打印看到了Stack overflow线程栈溢出的打印 联想到是新加的消息处理函数后出现的估计是新加的消息处理函数中引发了线程栈溢出的问题。 于是让同事打开新加的消息处理函数的代码 一眼就看出来问题用TInstantConference_Api结构体定义了一个局部变量 TMtInstantConference_Api tInstanceConfInfo; 这个结构体我们以前也经常用该结构体的成员很多定义的很大很复杂。用该结构体定义的局部变量占用的就是栈空间会占用很大的栈空间导致所在线程占用的总的栈空间超过了分配给线程的栈空间的上限引发了Stack overflow线程栈溢出的异常。 3、发生Stack Overflow线程栈溢出的原因分析 在程序中添加以下的测试代码 int nSize sizeof(TMtInstantConference_Api); 看看这个结构体的大小。打断点调试运行上述代码返回的该结构体的大小为1096432/1024/1024 1.04MB。 在Windows系统中系统给每个线程分配的默认栈内存大小是1MB而此处直接使用这个TInstantConference_Api结构体直接定义一个局部变量光这个局部变量占用的栈内存就达到了1.04MB就超过了所在线程的1MB的栈内存的上限所以产生了Stack overflow线程栈溢出的异常。 4、线程占用的栈空间大小说明 线程是系统分配栈空间的基本单元即栈空间是分配给线程使用的。函数中的局部变量会占用栈内存函数调用时传递给被调用函数的参数占用的内存空间也是栈内存。 在函数调用时主调函数可能会通过栈将要传递给被调用函数的参数内存中的值压到栈上栈内存传递给被调用函数。这点在32位程序中比较常见但在64位程序中因为64位寄存器比较多就直接使用寄存器传递了寄存器传递相对栈内存传递效率会高一些。当然传递的参数比较多或者参数内存比较大时也会使用栈内存传递参数。 线程在某一时刻占用的栈空间的实际大小是当前线程的函数调用堆栈中所有函数占用的栈空间之和如果总和超过了系统分配给当前线程的栈空间上限就会引发Stack Overflow线程栈溢出的异常进而导致程序发生崩溃。 在Windows系统中系统给线程分配的默认栈内存大小是1MB。在Linux系统中系统给线程分配的默认栈内存大小是8MB可以在Linux系统中使用ulimit命令查看 这里涉及到C程序在运行时所占用的内存分区一般可分为栈内存区、堆内存区、全局/静态内存区、文字常量内存区及程序代码区5大分区。关于C程序的内存分区可以查看我的文章 实例详解C程序的五大内存分区https://blog.csdn.net/chenlycly/article/details/120958761 5、引发线程栈溢出的常见原因和场景总结 引发线程栈溢出问题可能有以下几个可能 1函数递归调用的深度过深 因为一直在递归调用在到达最底下的那层调用之前递归函数一直没返回栈空间一直没有释放导致当前线程占用的栈空间越来越多达到上限。2消息上触发函数的死循环调用 消息触发的函数死循环调用因为死循环调用了函数的栈空间一直没释放导致当前线程占用的栈空间越来越多。这个问题我们在实际项目中遇到过两次。3定义了一个占用内存很大的局部变量 比如定义了一个很庞大的结构体在一个函数中用该结构体定义了一个局部变量假设该结构体接近或者大于1MB则会直接导致线程栈溢出。4函数中使用switch...case语句包含了大量的case分支 每个case分支中都定义了局部变量导致当前函数占用了大量的栈空间。case分支中的局部变量的生命周期是在case分支中的即代码运行到对应的case分支中时该分支中的局部变量才有“生命”但其实这个局部变量的栈空间已经在函数入口处分配好栈空间了并不是代码执行到case子句中才分配栈空间的。这点可以通过编写测试代码查看函数入口处给当前函数分配栈空间的汇编代码就能看出来了可以先顶一个变量查看汇编代码看看分配了多少栈空间然后再增加一个变量看看分配的栈空间是否变大。5多个if-else分支每个分支中都有定义局部变量 引发问题的原因与多个case语句的原因是类似的此处就不再赘述了。 上述问题场景我在项目中都遇到过我也是通过项目遇到的问题总结出上述场景的。实践出真知大家要养成多思考多总结的习惯这对提升个人技术水平、积累实践经验是很有用处的 之前也排查过一个典型的线程栈内存溢出问题感兴趣的话可以去查看我之前写的文章 线程栈溢出异常程序崩溃在汇编代码test dword ptr [eax],eax上的问题排查https://blog.csdn.net/chenlycly/article/details/131743305 6、在问题函数入口处添加return语句在Debug下运行还是会发生线程栈溢出异常 既然问题出在新加的消息处理函数中同事尝试直接在该函数的入口处添加一句return语句 直接将当前消息处理函数return掉。然后再次测试还是会出现闪退依旧是Stack overflow线程栈溢出的异常。 其实依然出问题的原因很简单可以查看该函数的汇编代码在函数的入口处的汇编代码中我们可以看到给当前函数分配栈空间的汇编语句随便找个函数在函数入口处设置断点命中断点后鼠标右键点击断点附近的代码在弹出的右键菜单中点击“转到反汇编”去查看汇编代码上下文即可看到 这句汇编代码在return之前并且是编译时就确定加到二进制文件中的。 所以即使在函数入口处加了一句return但函数入口处的汇编还是分配了栈空间即还没执行到return这句代码时就已经给当前函数分配了栈内存所以还是会导致Stack overflow线程栈溢出的异常。因为还没执行到问题函数的内部在校验当前线程栈空间的代码时就出现了线程栈溢出的异常所以函数调用堆栈中看不到该函数的调用。 在这里给大家重点推荐一下我的几个热门畅销专栏欢迎订阅博客主页还有其他专栏可以去查看 专栏1该精品技术专栏的订阅量已达到480多个专栏中包含大量项目实战分析案例有很强的实战参考价值广受好评专栏文章持续更新中预计更新到200篇以上欢迎订阅 C软件调试与异常排查从入门到精通系列文章汇总https://blog.csdn.net/chenlycly/article/details/125529931 本专栏根据多年C软件异常排查的项目实践系统地总结了引发C软件异常的常见原因以及排查C软件异常的常用思路与方法详细讲述了C软件的调试方法与手段以图文并茂的方式给出具体的项目问题实战分析实例很有实战参考价值带领大家逐步掌握C软件调试与异常排查的相关技术适合基础进阶和想做技术提升的相关C开发人员 考察一个开发人员的水平一是看其编码及设计能力二是要看其软件调试能力所以软件调试能力排查软件异常的能力很重要必须重视起来能解决一般人解决不了的问题既能提升个人能力及价值也能体现对团队及公司的贡献 专栏中的文章都是通过项目实战总结出来的包含大量项目问题实战分析案例有很强的实战参考价值专栏文章还在持续更新中预计文章篇数能更新到200篇以上 专栏2   C常用软件分析工具从入门到精通案例集锦汇总专栏文章持续更新中...https://blog.csdn.net/chenlycly/article/details/131405795 常用的C软件辅助分析工具有PE工具、Dependency Walker、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题很有实战参考价值 专栏3本专栏涵盖了多方面的内容是当前重点打造的专栏专栏文章已经更新到380多篇持续更新中... C/C基础与进阶专栏文章持续更新中...https://blog.csdn.net/chenlycly/category_11931267.html 以多年的开发实战为基础总结并讲解一些的C/C基础与项目实战进阶内容以图文并茂的方式对相关知识点进行详细地展开与阐述专栏涉及了C/C领域多个方面的内容包括C基础及编程要点模版泛型编程、STL容器及算法函数的使用等、C11及以上新特性不仅看开源代码会用到日常编码中也会用到部分新特性面试时也会涉及到、常用C开源库的介绍与使用、代码分享调用系统API、使用开源库、常用编程技术动态库、多线程、多进程、数据库及网络编程等、软件UI编程Win32/duilib/QT/MFC、C软件调试技术排查软件异常的手段与方法、分析C软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等、设计模式、网络基础知识与网络问题分析进阶内容等。 专栏4    VC常用功能开发汇总专栏文章持续更新中...https://blog.csdn.net/chenlycly/article/details/124272585 将10多年C开发实践中常用的功能以高质量的代码展现出来。这些常用的高质量规范代码可以直接拿到项目中使用能有效地解决软件开发过程中遇到的问题。 专栏5  Windows C 软件开发从入门到精通专栏文章持续更新中...https://blog.csdn.net/chenlycly/category_12695902.html 根据多年C软件开发实践详细地总结了Windows C 应用软件开发相关技术实现细节分享了大量的实战案例很有实战参考价值。 7、在问题函数入口处添加return到release下运行就不报线程栈溢出的异常了 同事特意测试了一下保留函数入口处的return语句也可以在工程设置中在Debug下开启优化当然一般不这么设置此处是为了验证问题 编译release版本然后跑release版本并没有发生Stack overflow线程栈溢出的异常。也让我帮忙看看这是啥原因。 其实原因很简单想想应该就知道了是Release下的优化起的作用。因为Debug下为了调试将优化关闭了而Release下是开启优化的在Release下编译器发现函数入口处就return了就直接把return后面的代码都优化掉了只保留return语句所以生成的二进制文件中就不会分配那么大的栈内存了就不会有线程栈溢出的异常了。 8、如何查看函数入口处分配栈内存的汇编代码 随便找一个函数在函数开始处打上一个断点 然后开启调试运行当命中断点时直接右键点击断点处在弹出的右键菜单中点击“转到反汇编”菜单项 即可查看对应的汇编代码给函数分配栈空间的代码如下 系统给线程分配的1MB的栈空间当前线程中的函数会占用这一栈空间这里涉及到ebp和esp两个寄存器ebp用来存放当前函数的栈基址esp用来存放当前函数的栈顶地址。 栈内存是从大地址向小地址使用的对于被调用函数其栈基址就是主调函数的栈顶地址保存到ebp中即mov ebp, esp可以看上面汇编截图中的入口处。然后在被调用函数中在该被调用函数入口处的esp就是主调函数的栈顶地址减去一个数值同时将减的结果赋值给当前的esp。这样被调函数占用的栈空间范围就是当前函数的esp到ebp中的范围其中esp ebp。 这里结合函数调用时的栈分布更好理解关于函数调用时的栈分布可以查看我的文章 C函数调用栈分布详解https://blog.csdn.net/chenlycly/article/details/121001096 9、最后 本文通过一个Stack Overflow线程栈溢出的问题实战分析实例详细讲解了线程栈溢出涉及到的诸多细节有一定的参考价值希望对大家能有所帮助。
http://www.w-s-a.com/news/71262/

相关文章:

  • 网站改版建设原则网站网站建设公司上海
  • 网站推广见效快的方法深圳高端网站建设网页设计
  • 建设银行官网首页网站购纪念币接做网站需要问什么条件
  • 网站的ftp地址是什么江苏做网站
  • 宁波网站建设制作公司哪家好潍坊建公司网站
  • 云端网站建设php7 wordpress速度
  • 建站的公司中小企业网站建设报告
  • 上海高档网站建设网站设计入门
  • 德尔普网站建设做网站线
  • 宁波网站搭建定制非模板网站建设电子商务公司名称大全简单大气
  • 巴中哪里做网站推销网站的方法
  • wordpress建站动画网站宣传的手段有哪些?(写出五种以上)
  • 做么网站有黄医疗机构网站备案
  • 企业年金是1比3还是1比4北京厦门网站优化
  • 政务信息网站建设工作方案云南建设工程质量监督网站
  • 如何做一份企业网站免费的短视频素材库
  • 云脑网络科技网站建设咸阳软件开发
  • seo对网站优化网站更换程序
  • 网站建设放什么科目中小学生在线做试卷的网站6
  • 网站建设推广公司排名绥化建设局网站
  • 凡科做的网站为什么打不开苏州行业网站建设
  • 南昌定制网站开发费用微信小商店官网入口
  • 深圳网站建设费用找人做的网站怎么看ftp
  • 做网站cookie传值dedecms网站后台
  • 温州网站推广网站建设要学会什么
  • c 网站开发框架品牌策划方案范文
  • 儿童摄影作品网站多元网络兰州网站建设
  • 电脑上不了建设厅网站常德网站建设费用
  • 做单页免费模板网站最新办公室装修风格效果图
  • 中国铁路建设投资公司网站熊学军想开网站建设公司