![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
调试
文章平均质量分 77
460833359
这个作者很懒,什么都没留下…
展开
-
性能分析工具gprof介绍
Ver:1.0目录1. GPROF介绍 42. 使用步骤 43. 使用举例 43.1 测试环境 43.2 测试代码 43.3 数据分析 53.3.1 flat profile模式 63.3.2 call graph模式 74. 链接库中的函数 75. 使用局限 86. 分析示例 12%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1. gprof介绍gprof是GNU profile工具,可以运行于linux、AIX、Sun等操作系统进行C、C+转载 2022-03-16 18:22:18 · 6125 阅读 · 0 评论 -
objdump & nm & addr2line&readelf
GCC把C语言源文件('.c')编译成汇编语言文件('.s'),汇编器把汇编语言文件翻译成目标文件('.o'),最后由链接器链接所有的目标文件和有关的库生成可执行文件('a.out')。如打开'-g'选项,GCC编译'.c'文件时,把附加的调试信息插进'.s'文件,这些调试信息经汇编器和链接器稍加转换一直传到可执行文件中。这些调试信息包括行号、变量的类型和作用域、函数名字、函数参数和函数的作用域等源文件的特性。在 某些目标文件中,调试信息用'.stab'打头的一类汇编指导命令表示,这些指导命令穿插在汇编转载 2022-01-24 11:20:16 · 737 阅读 · 0 评论 -
linux top命令查看内存及多核CPU的使用讲述
查看多核CPU命令mpstat-PALL和sar-PALL说明:sar-PALL>aaa.txt重定向输出内容到文件aaa.txttop命令经常用来监控linux的系统状况,比如cpu、内存的使用,程序员基本都知道这个命令,但比较奇怪的是能用好它的人却很少,例如top监控视图中内存数值的含义就有不少的曲解。本文通过一个运行中的WEB服务器的top监控截图,讲述top视图中的各种数据的含义,还包括视图中各进程(任务)的字段的排序。top进...转载 2021-12-25 17:56:44 · 4001 阅读 · 1 评论 -
动态库装载及 dlsym的RTLD_NEXT参数详解
在看公司spp框架代码的时候发现了如下一段宏定义,其中的dlsym函数及其RTLD_NEXT参数的含义不是很明白,于是网上搜了下这里做个记录。#define mt_hook_syscall(name) \do { \ if (!g_mt_sys...转载 2021-12-13 19:49:52 · 408 阅读 · 0 评论 -
AddressSanitizer使用介绍
1、关于AddressSanitizer1.1 引言也许很多人都听说过类似这样的一个故事:某公司的服务器每隔3个月就会毫无预兆的崩溃一次,怎么也查不出原因,为了避免崩溃可能引发的问题,只得每2个月手动重启一次服务器。在这类有些灵异的事件背后,以内存泄露为代表的一系列内存错误往往就是那个幕后黑手。在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费转载 2021-12-11 17:11:24 · 638 阅读 · 0 评论 -
ubuntu 13.04 编译 安装 升级 gcc 4.9.0 address sanitizer
@ 前记: 最近查一个线上项目的crash,review代码无果,crash几率低,不可在本地环境重现。之后在线上好几个服务器跑valgrind就不crash了。个人猜测可能是跑valgrind后性能下降的比较严重,导致crash那个点触发不到了。 gcc从4.8开始支持address sanitizer,也比较好用,文章最后会简单分析下用法。 另我的环境是ubuntu13.04+gcc4.7.3,目标是升级到4.9.0。@ 编译gcc4.9.0$wget ftp:/...转载 2021-12-11 17:06:17 · 353 阅读 · 0 评论 -
Address Sanitizer 用法
Address Sanitizer(ASan)是一个快速的内存错误检测工具。这里说明它的用法。参考资料AddressSanitizerhttps://github.com/google/sanitizers/wiki/AddressSanitizer1. 简介Address Sanitizer(ASan)是一个快速的内存错误检测工具。它非常快,只拖慢程序两倍左右(比起Valgrind快多了)。它包括一个编译器instrumentation模块和一个提供malloc()/free()替代项的运转载 2021-12-11 17:02:03 · 1199 阅读 · 0 评论 -
linux下定位多线程内存越界问题实践总结
近定位了在一个多线程服务器程序(OceanBase MergeServer)中,一个线程非法篡改另一个线程的内存而导致程序core掉的问题。定位这个问题历经曲折,尝试了各种内存调试的办法。往往感觉就要柳暗花明了,却发现又进入了另一个死胡同。最后,使用强大的mprotect+backtrace+libsigsegv等工具成功定位了问题。整个定位过程遇到的问题和解决办法对于多线程内存越界问题都很典型,简单总结一下和大家分享。现象core是在系统集成测试过程中发现的。服务器程序MergeServer有一个转载 2021-12-07 14:59:32 · 1012 阅读 · 1 评论 -
linux下定位异常消耗的线程实战分析
前言:之前分享过一篇Linux开发coredump文件分析实战分享,今天再来分享一篇实战文章。在我们嵌入式linux开发过程中,开发过程中我们经常会使用多进程、多线程开发。那么多线程使用过程中,我们大概率会遇到某线程长时间占用cpu,导致设备执行异常。通常只有四五个线程,我们可以通过一个个线程调试捕捉到异常线程,如果你开发的设备上面运行了大概三四十个线程,我们一下子不好看到对应哪个线程出问题,也不好使用列举法进行搜索,这个时候我们需要配合一些工具进行监控以及检查我们执行的进程下面的线程。下面我.转载 2021-12-07 11:23:56 · 637 阅读 · 0 评论 -
Malloc内存泄露和内存越界问题的研究
Malloc内存泄露和内存越界问题的研究------内存跟踪与检测篇1.引言熟悉c语言的人都知道,内存泄露,特别是内存越界是软件界非常棘手,甚至防不胜防的问题。由于这种问题一般为概率问题,时而出现时而不出现,这样给问题的定位分析带来很大的困难,后期排查的代价也比较大,因此,这个问题一直困扰着软件开发人员和软件界。不管多牛的技术高手,甚至技术专家都不敢拍着胸脯说,他负责的项目没有内存泄露和内存越界问题。那如何解决这种问题呢?解决这种问题无非有两种方案,一:进行后期内存跟踪,即...转载 2021-12-06 11:43:17 · 1653 阅读 · 0 评论 -
大数组导致线程栈溢出(大数组分配失败导致core)
linux默认8M(ulimit -s:8192KB),在一个memcpy操作里core了,gdb调试没发现问题,数组大小是3M多。单线程8M,可能这里分配失败了,改为20M,不再core。在.bashrc里加入一行:ulimit -s 20480转载 2021-11-18 17:16:28 · 147 阅读 · 0 评论 -
程序运行崩溃(segfault)的排查方法
程序挂掉后,在终端通过指令dmesg#或者dmesg | grep 你的程序名在系统日志中查找到相关的信息。随便写个例子:a.out[2374]: segfault at 7f0ed0bfbf70 ip 00007f0edd646fe7 sp 00007f0ed3603978 error 4 a.out[7f0edd514000+1b6000]at(位置),ip(instruction pointer 指令指针),sp(stack pointer 堆指针),后面跟的都是地址。转载 2021-11-08 15:14:18 · 6622 阅读 · 2 评论 -
Linux内核Crash分析
在工作中经常会遇到一些内核crash的情况,本文就是根据内核出现crash后的打印信息,对其进行了分析,使用的内核版本为:Linux2.6.32。 每一个进程的生命周期内,其生命周期的范围为几毫秒到几个月。一般都是和内核有交互,例如用户空间程序使用系统调用进入内核空间。这时使用的不再是用户空间的栈空间,使用对应的内核栈空间。对每一个进程来说,Linux内核都会把两个不同的数据结构紧凑的存放在一个单独为进程分配的存储空间中:一个是内核态的进程堆栈,另一个是紧挨进程描述符的数据结构thre...转载 2021-11-05 11:51:14 · 1675 阅读 · 0 评论 -
coredump产生的几种可能情况
coredump产生的几种可能情况造成程序coredump的原因有很多,这里总结一些比较常用的经验吧:1,内存访问越界 a) 由于使用错误的下标,导致数组访问越界。 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符。 c) 使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snpr...转载 2021-11-05 11:47:36 · 1631 阅读 · 0 评论 -
fork 多进程调试
实例代码 1 #include <unistd.h> 2 #include <stdio.h> 3 int main () 4 { 5 pid_t fpid; <span style="color:#3333ff;">6 printf("aaaaaaaaaaaaaaaaaa!\n");</span> 7 fpid=fork(); 8 printf("bbbbbbbbbbbbbbbbbb...转载 2021-10-25 15:16:12 · 472 阅读 · 0 评论 -
linux动态链接库导出函数控制
windows 环境的vc的话,可以方便的指定__declspec(dllexport) 关键字来控制是否把dll中的函数导出。我也来测试一下linux下面是如何做的:先看gcc 和ld的相关选项======================================gcc 选项 -shared Produce a shared object which can then be linked with other objects to ...转载 2021-08-28 17:49:14 · 1135 阅读 · 0 评论 -
gcc选项-g与-rdynamic的异同
转自:http://www.lenky.info/archives/2013/01/2190gcc的-g,应该没有人不知道它是一个调试选项,因此在一般需要进行程序调试的场景下,我们都会加上该选项,并且根据调试工具的不同,还能直接选择更有针对性的说明,比如-ggdb。-g是一个编译选项,即在源代码编译的过程中起作用,让gcc把更多调试信息(也就包括符号信息)收集起来并将存放到最终的可执行文件内。相比-g选项,-rdynamic却是一个连接选项,它将指示连接器把所有符号(而不仅仅只是程...转载 2021-08-28 17:46:45 · 2645 阅读 · 0 评论