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

外贸获客软件巴彦淖尔seo

外贸获客软件,巴彦淖尔seo,大秀,模板多少钱一平方zz自 http://blog.csdn.net/destina/article/details/6198443 感谢作者的分享#xff01; 一 valgrind是什么#xff1f; Valgrind是一套Linux下#xff0c;开放源代码#xff08;GPL V2#xff09;的仿真调试工具的集合。Valgrind由内核#xff08;core#xff09;以…  zz自 http://blog.csdn.net/destina/article/details/6198443  感谢作者的分享 一  valgrind是什么 Valgrind是一套Linux下开放源代码GPL V2的仿真调试工具的集合。Valgrind由内核core以及基于内核的其他调试工具组成。内核类似于一个框架framework它模拟了一个CPU环境并提供服务给其他工具而其他工具则类似于插件 (plug-in)利用内核提供的服务完成各种特定的内存调试任务。Valgrind的体系结构如下图所示 valgrind的结构图 Valgrind包括如下一些工具 Memcheck。这是valgrind应用最广泛的工具一个重量级的内存检查器能够发现开发中绝大多数内存错误使用情况比如使用未初始化的内存使用已经释放了的内存内存访问越界等。这也是本文将重点介绍的部分。Callgrind。它主要用来检查程序中函数调用过程中出现的问题。Cachegrind。它主要用来检查程序中缓存使用出现的问题。Helgrind。它主要用来检查多线程程序中出现的竞争问题。Massif。它主要用来检查程序中堆栈使用中出现的问题。Extension。可以利用core提供的功能自己编写特定的内存调试工具 linux下内存空间布置 一个典型的Linux C程序内存空间由如下几部分组成 代码段.text。这里存放的是CPU要执行的指令。代码段是可共享的相同的代码在内存中只会有一个拷贝同时这个段是只读的防止程序由于错误而修改自身的指令。初始化数据段.data。这里存放的是程序中需要明确赋初始值的变量例如位于所有函数之外的全局变量int val100。需要强调的是以上两段都是位于程序的可执行文件中内核在调用exec函数启动该程序时从源程序文件中读入。未初始化数据段.bss。位于这一段中的数据内核在执行该程序前将其初始化为0或者null。例如出现在任何函数之外的全局变量int sum;堆Heap。这个段用于在程序中进行动态内存申请例如经常用到的mallocnew系列函数就是从这个段中申请内存。栈Stack。函数中的局部变量以及在函数调用过程中产生的临时变量都保存在此段中。 Memcheck 能够检测出内存问题关键在于其建立了两个全局表。 Valid-Value 表 对于进程的整个地址空间中的每一个字节(byte)都有与之对应的 8 个 bits对于 CPU 的每个寄存器也有一个与之对应的 bit 向量。这些 bits 负责记录该字节或者寄存器值是否具有有效的、已初始化的值。 Valid-Address 表 对于进程整个地址空间中的每一个字节(byte)还有与之对应的 1 个 bit负责记录该地址是否能够被读写。 检测原理 当要读写内存中某个字节时首先检查这个字节对应的 A bit。如果该A bit显示该位置是无效位置memcheck 则报告读写错误。内核core类似于一个虚拟的 CPU 环境这样当内存中的某个字节被加载到真实的 CPU 中时该字节对应的 V bit 也被加载到虚拟的 CPU 环境中。一旦寄存器中的值被用来产生内存地址或者该值能够影响程序输出则 memcheck 会检查对应的V bits如果该值尚未初始化则会报告使用未初始化内存错误。 Valgrind 使用 用法: valgrind [options] prog-and-args [options]: 常用选项适用于所有Valgrind工具 -toolname 最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。 h –help 显示帮助信息。 -version 显示valgrind内核的版本每个工具都有各自的版本。 q –quiet 安静地运行只打印错误信息。 v –verbose 更详细的信息, 增加错误数统计。 -trace-childrenno|yes 跟踪子线程? [no] -track-fdsno|yes 跟踪打开的文件描述[no] -time-stampno|yes 增加时间戳到LOG信息? [no] -log-fdnumber 输出LOG到描述符文件 [2stderr] -log-filefile 将输出的信息写入到filename.PID的文件里PID是运行程序的进行ID -log-file-exactlyfile 输出LOG信息到 file -log-file-qualifierVAR 取得环境变量的值来做为输出信息的文件名。 [none] -log-socketipaddr:port 输出LOG到socket ipaddr:port LOG信息输出 -xmlyes 将信息以xml格式输出只有memcheck可用 -num-callersnumber show number callers in stack traces [12] -error-limitno|yes 如果太多错误则停止显示新错误? [yes] -error-exitcodenumber 如果发现错误则返回错误代码 [0disable] -db-attachno|yes 当出现错误valgrind会自动启动调试器gdb。[no] -db-commandcommand 启动调试器的命令行选项[gdb -nw %f %p] 适用于Memcheck工具的相关选项 -leak-checkno|summary|full 要求对leak给出详细信息? [summary] -leak-resolutionlow|med|high how much bt merging in leak check [low] -show-reachableno|yes show reachable blocks in leak check? [no] Valgrind 使用举例一 下面是一段有问题的C程序代码test.c span stylefont-size: 16px;i nclude stdlib.h void f(void) {int* x malloc(10 * sizeof(int));x[10] 0; //问题1: 数组下标越界 } //问题2: 内存没有释放/spanspan stylefont-size: 16px;int main(void) {f();return 0;}/spanspan stylefont-size: 16px;1、 编译程序test.c gcc -Wall test.c -g -o test 2、 span classsearch使用/spanspan classsearchValgrind/span检查程序BUG span classsearchvalgrind/span --toolmemcheck --leak-checkfull ./test/span使用未初始化内存问题 问题分析 对于位于程序中不同段的变量其初始值是不同的全局变量和静态变量初始值为0而局部变量和动态申请的变量其初始值为随机值。如果程序使用了为随机值的变量那么程序的行为就变得不可预期。 下面的程序就是一种常见的使用了未初始化的变量的情况。数组a是局部变量其初始值为随机值而在初始化时并没有给其所有数组成员初始化如此在接下来使用这个数组时就潜在有内存问题。   结果分析 假设这个文件名为badloop.c生成的可执行程序为badloop。用memcheck对其进行测试输出如下。   输出结果显示在该程序第11行中程序的跳转依赖于一个未初始化的变量。准确的发现了上述程序中存在的问题。 内存读写越界 问题分析 这种情况是指访问了你不应该/没有权限访问的内存地址空间比如访问数组时越界对动态内存访问时超出了申请的内存大小范围。下面的程序就是一个典型的数组越界问题。pt是一个局部数组变量其大小为4p初始指向pt数组的起始地址但在对p循环叠加后p超出了pt数组的范围如果此时再对p进行写操作那么后果将不可预期。   结果分析 假设这个文件名为badacc.cpp生成的可执行程序为badacc用memcheck对其进行测试输出如下。   输出结果显示在该程序的第15行进行了非法的写操作在第16行进行了非法读操作。准确地发现了上述问题。 内存覆盖 问题分析 C 语言的强大和可怕之处在于其可以直接操作内存C 标准库中提供了大量这样的函数比如 strcpy, strncpy, memcpy, strcat 等这些函数有一个共同的特点就是需要设置源地址 (src)和目标地址(dst)src 和 dst 指向的地址不能发生重叠否则结果将不可预期。 下面就是一个 src 和 dst 发生重叠的例子。在 15 与 17 行中src 和 dst 所指向的地址相差 20但指定的拷贝长度却是 21这样就会把之前的拷贝值覆盖。第 24 行程序类似src(x20) 与 dst(x) 所指向的地址相差 20但 dst 的长度却为 21这样也会发生内存覆盖。   结果分析 假设这个文件名为 badlap.cpp生成的可执行程序为 badlap用 memcheck 对其进行测试输出如下。   输出结果显示上述程序中第151724行源地址和目标地址设置出现重叠。准确的发现了上述问题。 动态内存管理错误 问题分析 常见的内存分配方式分三种静态存储栈上分配堆上分配。全局变量属于静态存储它们是在编译时就被分配了存储空间函数内的局部变量属于栈上分配而最灵活的内存使用方式当属堆上分配也叫做内存动态分配了。常用的内存动态分配函数包括malloc, alloc, realloc, new等动态释放函数包括free, delete。 一旦成功申请了动态内存我们就需要自己对其进行内存管理而这又是最容易犯错误的。下面的一段程序就包括了内存动态管理中常见的错误。   常见的内存动态管理错误包括 申请和释放不一致 由于 C 兼容 C而 C 与 C 的内存申请和释放函数是不同的因此在 C 程序中就有两套动态内存管理函数。一条不变的规则就是采用 C 方式申请的内存就用 C 方式释放用 C 方式申请的内存用 C 方式释放。也就是用 malloc/alloc/realloc 方式申请的内存用 free 释放用 new 方式申请的内存用 delete 释放。在上述程序中用 malloc 方式申请了内存却用 delete 来释放虽然这在很多情况下不会有问题但这绝对是潜在的问题。 申请和释放不匹配 申请了多少内存在使用完成后就要释放多少。如果没有释放或者少释放了就是内存泄露多释放了也会产生问题。上述程序中指针p和pt指向的是同一块内存却被先后释放两次。 释放后仍然读写 本质上说系统会在堆上维护一个动态内存链表如果被释放就意味着该块内存可以继续被分配给其他部分如果内存被释放后再访问就可能覆盖其他部分的信息这是一种严重的错误上述程序第16行中就在释放后仍然写这块内存。 结果分析 假设这个文件名为badmac.cpp生成的可执行程序为badmac用memcheck对其进行测试输出如下。   输出结果显示第14行分配和释放函数不一致第16行发生非法写操作也就是往释放后的内存地址写值第17行释放内存函数无效。准确地发现了上述三个问题。 内存泄漏 问题描述 内存泄露Memory leak指的是在程序中动态申请的内存在使用完后既没有释放又无法被程序的其他部分访问。内存泄露是在开发大型程序中最令人头疼的问题以至于有人说内存泄露是无法避免的。其实不然防止内存泄露要从良好的编程习惯做起另外重要的一点就是要加强单元测试Unit Test而memcheck就是这样一款优秀的工具。 下面是一个比较典型的内存泄露案例。main函数调用了mk函数生成树结点可是在调用完成之后却没有相应的函数nodefr释放内存这样内存中的这个树结构就无法被其他部分访问造成了内存泄露。 在一个单独的函数中每个人的内存泄露意识都是比较强的。但很多情况下我们都会对malloc/free 或new/delete做一些包装以符合我们特定的需要无法做到在一个函数中既使用又释放。这个例子也说明了内存泄露最容易发生的地方即两个部分的接口部分一个函数申请内存一个函数释放内存。并且这些函数由不同的人开发、使用这样造成内存泄露的可能性就比较大了。这需要养成良好的单元测试习惯将内存泄露消灭在初始阶段。       结果分析 假设上述文件名位tree.h, tree.cpp, badleak.cpp生成的可执行程序为badleak用memcheck对其进行测试输出如下。 该示例程序是生成一棵树的过程每个树节点的大小为12考虑内存对齐共8个节点。从上述输出可以看出所有的内存泄露都被发现。Memcheck将内存泄露分为两种一种是可能的内存泄露Possibly lost另外一种是确定的内存泄露Definitely lost。Possibly lost 是指仍然存在某个指针能够访问某块内存但该指针指向的已经不是该内存首地址。Definitely lost 是指已经不能够访问这块内存。而Definitely lost又分为两种直接的direct和间接的indirect。直接和间接的区别就是直接是没有任何指针指向该内存间接是指指向该内存的指针都位于内存泄露处。在上述的例子中根节点是directly lost而其他节点是indirectly lost。
http://www.yutouwan.com/news/323651/

相关文章:

  • wordpress 移动站插件建筑企业资质新规定2022
  • 德阳中恒网站建设深圳人才网官网
  • 网站返利程序淘宝做短视频网站好
  • 做网站的证书山东城乡和住房建设厅官网
  • 网站设计宽度尺寸芜湖网站备案咨询电话
  • 商业网站排名优化网络推广外包
  • 网站制作的费用宝塔搭建网站教程
  • 辽宁省网站备案注销建筑人才网最新招聘信息息
  • 西安网站推广都是怎么做的网页搜索
  • 鞍山商城网站建设上海网站制作机构
  • 深圳网站建设 百业海淀网站设计公司
  • 做个公司展示网站多少钱 后期有什么费用安徽网站优化好不好
  • 合规部对于网站建设的意见wordpress 建站群
  • 工商注册官方网站抖音代运营比较有名的公司
  • 那个网站可以做网页seo自动推广软件
  • 做一个网站多久做app网站有哪些
  • 论坛类网站备案徐州seo外包公司
  • 合肥网站建设的价格做网站公司 深圳信科
  • 免费设计的网站华诚博远建筑规划设计公司
  • 书籍封面设计网站精品网课平台
  • 14年网站开发经验四大网站是哪四大
  • 专业开发网站企业wordpress文章末尾添加内容
  • 北京学网站开发seoyoon
  • android 做分享的网站什么平台可以推广
  • 新手学做网站下载网站备案相机
  • 微信端网站开发模板什么网站可以查建设用地规划许可证
  • 当富广州网站建设wordpress等级
  • 不得不知道网站源码网站推荐
  • 金溪网站建设推广国内做心理咨询师培训出名的网站
  • 公司网站的设计风格大多是上海百度seo牛巨微