编译器内存问题调试技术讲座课件_第1页
编译器内存问题调试技术讲座课件_第2页
编译器内存问题调试技术讲座课件_第3页
编译器内存问题调试技术讲座课件_第4页
编译器内存问题调试技术讲座课件_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、软件调试经验交流zhongguoguojijiankongyanjiuyuzhouzhongxin第1页,共51页。编译器选项、常用工具与调试器介绍内存问题的一些调试方法事后调试的一些经验个人调试经验与建议第2页,共51页。编译器选项目前监控系统采用中的编译器vc6、intel-c+9.0 solaris-CC CXX6.1以solaris和windows为代表编译选项的不同会给调试带来不同的结果,需要细致选择第3页,共51页。Solaris系统与编译器相关选项Unix系统的可执行文件为ELF文件格式,符号存在与生成的文件中,默认情况下,即使release程序,依然会在程序中保留符号表编译器中

2、与调试相关的选项g 用于与调试一起使用的编译。g0 编译以便进行调试,但不禁用内联。s 从可执行文件中去掉符号表。-xcheck 对栈溢出增加一个运行时检查。第4页,共51页。Solaris常用调试工具命令dbx studio自带调试器dtrace 操作系统自带探测器pstack 察看程序运行栈prstatgcore mdb 通用模块调试器gdb第5页,共51页。dbx 常用命令debug/attach debug progname pid attach piddetach/kill up/down /frame frame h print whereiswhatisthreads /thre

3、ad第6页,共51页。Solaris调试符号-g 生成调试符号,相关动态库也必须如此生成才能看到源代码release模式下仅提供栈回溯信息察看debug模式可以定位到代码行,查看函数参数可使用strip命令剥离调试符号第7页,共51页。windows系统与编译器选项操作系统checked build 与free build推荐多多察看公司订阅的MSDN现阶段windows采用符号文件与目标文件分离的方式,PDB格式第8页,共51页。Windows编译器选项/GZ 运行时安全检查 与/Ox冲突/RTC vs7以上有效,运行时安全检查/Zi 生成完整的调试信息 与/Ox冲突/GS 缓冲区安全检查/

4、Od 禁用优化信息第9页,共51页。windows常用调试工具微软拥有两个调试器开发小组windbg工具包 ,支持内核级别调试,建议在环境不友好或者难于解决某个问题时使用,也适用于多线程调试vs debugger tool (codeview)随IDE发布,更易上手,建议日常工作使用第10页,共51页。Windbg-集成的强大工具包gflags 设置各类调试标志ntsd.exe/cdb.exe /kd.exe 命令行调试器adplus.vbs 导出dump文件脚本windbg.exe 带界面的调试器第11页,共51页。windbg常用命令k显示栈 显示线程 * . # *全部 .当前 #故障d

5、/da/db/ddx 查找符号r 寄存器.cls g.reload.lastevent第12页,共51页。gflags设置系统调试选项System Registry 对系统设置,所用进程生效Kernel Flags 对设置后所有新运行进程生效,重起后失效Image Files 对单个模块生效第13页,共51页。gflags第14页,共51页。Windows系统调试符号的获取设置环境变量 Set _NT_SYMBOL_PATH = symsrv*c:localsymbols*/download/symbols 调试包中的SymChk.exe 实用工具 调试符号文件(PDB) 具备时标信息,严格匹

6、配对于操作系统符号推荐使用SRV语法,动态获取,如需出差可下载离线安装包/whdc/DevTools/Debugging/symbolpkg.mspx第15页,共51页。常见内存问题的分类问题可能的原因错误释放尝试释放尚未分配的内存重复释放尝试释放已释放过的堆块未分配的内存读溢出堆块边界或访问已被释放的堆块的指针读未初始化内存从未初始化的内存中进行读取写入到只读内存向文本地址写入、向只读区、只读的页写入写未分配内存溢出堆块边界或访问已被释放的堆块的迷失指针越界写/读错误下标或偏移,导致写入/读取非预定、但区域合法第16页,共51页。Windows的堆管理ApplicationCRT堆(进程私用

7、)Win32运行时内存管理器操作系统内存管理器new/ mallocVirtualAllocHeapAllocHeapCreate操作系统按页分配内存,最小为4kbWin32堆管理器分配内存考虑到效率与字节问题分配内存的最小单位是4字节第17页,共51页。windows悲剧的由来release/debug、程序跑飞了操作系统默认不对应用程序私用堆进行检查对于x86,操作系统以4KB为单位进行分配,如果页内出错,可能并不导致程序立刻崩溃。操作系统对于连续页边界也并不默认进行保护,如果你的程序非法访问了下一页的内容,凑巧,这一页确实存在,也很有可能不会立刻出错。第18页,共51页。设置系统调试标志

8、PageHeap Application Verifier gflags 第19页,共51页。内存堆调试的常用调试标志调试机制描述典型应用栈回溯UST记录堆分配函数的调用过程检查内存泄漏堆尾检查htc在堆尾设置保护字段检查堆缓冲区溢出释放检查 hfc释放内存时检查多次释放同一区域参数检查 hpc检查调用堆函数时的参数发现错误参数页堆 PH分配栅栏页,强制在边界分配内存堆溢出第20页,共51页。solaris 使用运行期检查dbx 使用check access相对来说,unix的内存保护机制比windows要好的多,基本上可以在第一现场崩溃第21页,共51页。Windows stack unwi

9、nding 问题windows的栈展开依赖于调试符定位,与编译时优化的栈指针省略也有关系。重新编译程序,匹配调试符号关闭程序优化手工构造程序栈参见/en-us/library/cc267826.aspx第22页,共51页。栈问题困难所在操作系统默认不对程序栈进行检查如果开启FPO,会导致程序真正崩溃时的栈信息错误,无法获取有效信息第23页,共51页。栈破坏问题的调试经验并无特别好的调试方法 常见原因是栈上创建的数组或者字符串越界,开启缓冲区检查,有助于帮助调试该问题大致定位后仔细跟踪相对而言,unix系统的情况好一些,一般可以及时发现栈破坏而主动dump第24页,共51页。内存泄漏调试的基本方

10、法无论什么方法,大都是映射到最底层的内存分配/释放调用进行配对,同时记录分配时的调用栈,确定泄漏地址。工具和方法都不是万能的,并且生成报告相当繁琐,需要仔细查找和耐心分析。对于引用计数类误报率很高(QString)第25页,共51页。内存泄漏初始分析使用检测工具定义回避策略windows任务管理器procexpprstatesolaris进程管理器LeakDiagAppVerdbx修改代码自动垃圾回收第26页,共51页。资源泄漏-windows调试器调试使用专门的微软检测工具静态代码检查工具 漏报率较高Purify运行时检查 误报率很高设置正确的调试标志很重要第27页,共51页。内存泄漏-Wi

11、ndowsLeakDiagUMDH第28页,共51页。LeakDiag的使用选择一个进程选择检测的分配器也可生成dump第29页,共51页。UMDH的使用gflags 设置进程 Create user mode stack trace database安装系统调试符号 全部下载/在线下载set _NT_SYMBOL_PATH=srv*c:websymbols*/download/symbolsumdh-p:2230-f:c:Log1.txt 第30页,共51页。资源泄漏-solarisdbx 打开check leaks使用libumem使用dtracelibgc 高效自动分配/回收内存第31页

12、,共51页。资源泄漏-solarisdbx 1. 使用dbx启动被跟踪的程序。$ dbx target2. 用check -leaks打开内存泄漏检查开关。(dbx) check -leaks3. 运行程序直至结束。当程序运行结束时,dbx会给出检测报告第32页,共51页。资源泄漏-solarislibumem 设置环境变量,使程序预加载libumemsetenv UMEM_DEBUG default; setenv UMEM_LOGGING transaction; setenv LD_PRELOAD libumem.so.1; 启动后使用gcore生成dump文件第33页,共51页。资源泄

13、漏-solarislibumem mdb 调试器打开core文件:umem_status libumem的日志功能是否开启:findleaks命令查看是否有内存泄漏 :umalog 查看内存分配的时间,地址,堆栈 :umem_verify 查看内存是否被破坏 第34页,共51页。资源泄漏-solarisDTrace内嵌在Solaris系统中的子系统。它带有30000多个监测点 Probe),可以动态的搜集操作系统和应用程序的运行的方式和状态。/bigadmin/hubs/multilingual/simp_chinese/content/dtracehowto.jsp第35页,共51页。资源泄

14、漏-solarislibgc不是办法的办法solaris提供的自动垃圾回收库,当问题实在无法解决时,可使用。使用方法,链接的时候直接链接该库。第36页,共51页。事后调试-转储与分析没有良好的调试环境不能随意改变或者试验触发调试场景现场出差费用高昂第37页,共51页。事后调试的一般步骤分析相关性,定位故障模块与大致问题触发故障抓取系统快照进行业务分析第38页,共51页。软件的崩溃未经允许的情况下访问一个内存单元。硬件会感知这件事,并执行对操作系统(OS)的跳转 Unix 段错误(seg fault)Windows 一般性保护错误general protection fault 发生问题,在第一

15、现场崩溃,总比不崩溃的好第39页,共51页。Unixdump的生成limit coredumpsize 1000 000第40页,共51页。Windows获取dump文件drwtsn32 adplus设置合适的调试标志位第41页,共51页。使用Adplus抓取dump设置合适的调试标志位(gflags)设置adplus随目标程序启动gflags 中将该进程调试器设置为Debugger=c:debugdump.bat编辑获取dump的脚本dump.batcscript.exe c:xxadplus.vbs crash o d:filedump quiet sc %1第42页,共51页。一些cra

16、sh调试tipswindows使用release程序调试发布某个版本程序时,保存一个checked builded有效设置调试标志第43页,共51页。现场调试危机与压力搜集分析假设求证修复验证第44页,共51页。个人现场调试的一些经验-动手之前无论做什么,备份先!沟通从心开始,与客户沟通,与工程人员沟通,了解情况,抚慰客户受伤的心要了解问题,必先了解环境,操作系统日志、异常、商业数据库日志、异常、监控软件相关模块日志。合理使用工具,抓包软件,性能监视工具,调试工具第45页,共51页。个人现场调试的一些经验 经验总结从源头开始 每一条河流必有源头数据,一切问题一定从输入开始最小启动/最小配置替换与取代确定问题模块调试符号与程序的匹配相当关键第46页,共51页。个人现场调试的一些经验-工具之外耐心与细心唯意志论与回避论均不可取不用工具万万不能,依赖工具切切不可第47页,共51页。对于软件调试/开发的一些个人建议程序良好的可调试性,应作为设计目标之一。最短距离/最小范围/立刻终止/可追溯/可控制/可重复/可观察/可辨识增加代码的动态验证过程(Purify,intel profile)编译器的统一和规范与客户沟通的标准流程? 常见问题FAQ的整理第48页,共51页。对于软件调试/开发的一些个人建议做个懒人尽量不要显式分配内存(或使用智能指针)例:char数组

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论