linux中的调试知识---基础gdb和strace查看系统调用信息,top性能分析,ps进程查看,内存分析工具
1 调试一般分为两种方法
可以通过在程序中插入打印语句。有点能够显示程序的动态过程,比较容易的检查出源程序中的有关信息。缺点就是效率比较低了,而且需要输入大量无关的数据。
2 借助相关的调试工具。
gdb
3 有哪些常用的调试工具呢?
3.1 strace
(1)我们知道在进行创建文件或者复制文件这些操作的时候,应用程序需要和操作系统进行一些交互。但是我们的程序一般不能直接访问linux的内核。但是应用程序会跳转到system_call的内核位置,内核然后检查系统的调用号,然后这个号码告诉内核需要什么服务。这就是所谓的"系统调用"
(2)认识starce

然后.g++ -o debug debug.cpp
strace ./debug就会出现如下图内容(部分截图,小伙伴可以通过试试查看更详细的内容)

等号左边为系统调用的函数名及其参数,右边为返回值。通过上面部分的分析我们可以知道会自动调用很多函数用于进程初始化工作比如装载被执行程序,载入libc函数库,设置内存映射等。
(3) 统计系统调用
通过加上-c的做统计分析。比如strace -c ./debug.另外-o将结果输出到文件。-T将每个系统调用所花费的时间打印出来。-t.-tt等可以记录每次系统调用发生的时间。

3.2 gdb
(1)认识gdb
a:启动程序可以按照用户自定义的要求随心所欲的运行程序
b:可以被调试的程序在指定的断点挺住
c:当程序停住时候可以检查程序的运行状态
d:动态的改变程序的执行环境
(2)gdb常用方法
a:程序如下
#include<iostream>
using namespace std; int func(int n)
{
int result = 0;
for(int i=1;i<=n;i++)
{
result+=i;
}
return result;
} int main()
{
int arr[10];
arr[0] = 0;
arr[1] = 1;
for(int i=2;i<10;i++)
{
arr[i]=arr[i-1]+arr[i-2]; }
cout<<"arr[9]"<<arr[9]<<endl;
cout<<"func(9)"<<func(9)<<endl;
return 0;
}
b:gdb gdb进入gdb环境 l---->从第一行列出源码 按enter重复上一次命令,b 15----->表示在15行设置断点。info break----->查看断点。r----->运行程序.n----->表示next单步运行。p i--->打印变量。bt------>查看函数堆栈。q--->结束调试
(3)gdb分析core文件
a:core文件的存储路径。通常是在执行程序的时候会出现段错误。但是在当前的目录下面没有coredump文件。可以通过如下命令查看core文件的存在位置
cat /proc/sys/kernel/core_pattern
更改coredump文件的存储位置
echo "/data/coredump/core">/proc/sys/kernel/core_pattern
设置core文件的名字让我们清楚知道是哪一个程序的core错误
echo "/data/coredump/core.%e.%p">/proc/sys/kernel/core_pattern这样的core会自导崩溃的程序吗和进程ID
b:产生core的条件
有的时候需要确认当前的绘画能够生成coredump文件的大小。大小为0则不会生成对应的coredump文件。
通过ulimit -c可以查看coredump文件大小的最大值
通过ulimit -c unlimited设置core文件不受限制。如果需要指定大小则ulimit -c size但是只是对当前的会话有作用
(4)gdb定位coredump文件 非法访问内存
#include <stdio.h>
int main()
{
int b = 1;
int *a;
*a = b;
return 0;
}
查看coredump文件的ELF头部
readelf -h core..... 发现文件格式为CORE说明是core-dump文件
执行gdb test core*可以发现程序第5行*a=b 然后分别打印a和b的值 返现指向的地址为非法区域。也就是没有分配内存导致。
3.3 top

(1)相关参数说明
第一行:系统当前时间 系统运行时间 当前用户登陆数和系统的负载。其中负载分别为1min 5min 15min
第二行:total(进程总数) ruunig(正在运行的进程数) sleeping(睡眠的进程数) zombie(僵尸进程数)
第三行:%us(用户空间占用cpu比例) %id(空闲cpu百分比,通过这个可以反应一个系统的cou闲忙成都) %wa(等待输入输出io) %hi(cpu处理硬件终端时间)
第四行显示内存MEM数据:
buffers和cache区别:buffers是块设备的读写缓冲区,cache是文件系统本身的页面缓存。目的都是为了加速磁盘的访问。
3.4 ps
(1)常用命令1
ps -u 用户名 查看指定用户的信息
(2)显示某个进程信息
ps -ef| grep 进程名
(3)列出目前所有正在内存当中的程序
ps aux
好叻 今天就到这里了,加油!!!!
linux中的调试知识---基础gdb和strace查看系统调用信息,top性能分析,ps进程查看,内存分析工具的更多相关文章
- 在linux中如何调试C语言程序
		在Linux下面可以使用下面几种形式对C语言进行调试: 1 gdb gdb program 这是最原始的调试方法,若非熟悉命令行,这种方式其实是比较麿人的.有兴趣的可以参考一些我之前的博文.http: ... 
- Linux运维基础入门(四):Linux中的网络知识04
		一,虚拟机的安装 略 二,Linux系统下的网络配置(Linux虚拟机的网络设定为桥接模式) 桥接模式:虚拟机同主机一样,在网络中相当于一个真实存在的装有Linux系统的电脑.(我们先用这个模式) N ... 
- linux中的正则表达式知识梳理
		1. 正则表达式 1.1 正则表达式使用 正则表达式是开发者为了处理大量的字符串和文本而定义的一套规则和方法,使用正则表达式可以提高效率,快速获取想要的内容. 正则表达式常用于linux三剑客grep ... 
- linux中的shell编程----基础
		1,运行shell脚本有两种办法一般有两种: 先给可执行权限,再进入文件所在的目录,输入:./name.sh: 运行解释器再执行脚本:/bin/sh name.sh,这种情况下,脚本中可以没有#!/b ... 
- linux中uptime命令获取主机运行时间和查询系统负载信息
		系统中的uptime命令主要用于获取主机运行时间和查询linux系统负载等信息.uptime命令可以显示系统已经运行了多长时间,信息显示依次为:现在时间.系统已经运行了多长时间.目前有多少登陆用户.系 ... 
- java基础知识回顾之---java String final类 容易混淆的java String常量池内存分析
		/** * 栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放 在常量池中). 堆(heap):存 ... 
- 操作系统复习——如何查看一个进程的详细信息,如何追踪一个进程的执行过程 ,如何在 Linux 系统下查看 CPU、内存、磁盘、IO、网卡情况?epoll和select区别?
		1. 如何查看一个进程的详细信息,如何追踪一个进程的执行过程 通过pstree命令(根据pid)进行查询进程内部当前运行了多少线程:# pstree -p 19135(进程号) 使用top命令查看(可 ... 
- Linux基础与Linux下C语言编程基础
		Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ... 
- 【转】Linux基础与Linux下C语言编程基础
		原文:https://www.cnblogs.com/huyufeng/p/4841232.html ------------------------------------------------- ... 
随机推荐
- java IO 框架图
- iOS开发 - UIViewController控制器管理
			创建一个控制器 控制器常见的创建方式有下面几种 //通过storyboard创建 //直接创建 ViewController *vc = [[ViewController alloc] init]; ... 
- PHP框架的基本原理以及选择标准
			PHP框架的原理 说到PHP框架,可能很多PHP新手会感到有些胆怯.其实,PHP框架也不是那么深不可测的,框架就是别人使用PHP基础只是为你写好了的东西,只是封装在一起:这就好比我们使用PHP的函数, ... 
- jquery+easyui主界面布局一例
			<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="workbench.aspx ... 
- idea分支合并
			1.切换到指定分支(例如dev) 2.点击master的merge进行合并 注意:最好删掉本地的master和dev然后重新拉下远程的master和dev生成最新的本地master和dev 
- wpf Style也继承(包含内部定义事件)
			如何在既定皮肤下为某个style添加内容是我今天碰的问题,皮肤往往是对全局control进行设置的,当然这就无法满足某个个性十足的“另类”了,比如当使用DataGridCheckBoxColumn时, ... 
- wepy开发
			工欲善其事必先利其器 ide安装.配置] https://tencent.github.io/wepy/document.html VS Code 1. 在 Code 里先安装 Vue 的语法高亮 ... 
- Hadoop实战-使用Eclipse开发Hadoop API程序(四)
			一.准备运行所需Jar包 1)avro-1.7.4.jar 2)commons-cli-1.2.jar 3)commons-codec-1.4.jar 4)commons-collections-3. ... 
- ckeditor html标签的class 等attribute属性都被屏蔽啦,替换成空的解决方案
			ckeditor 模块中自定义class 在ckeditor模块中,编辑内容时, 在源码中填写<div class="myclass">some content< ... 
- 【LeetCode】Maximum Depth of Binary Tree
			http://oj.leetcode.com/problems/maximum-depth-of-binary-tree/ public class Solution { public int max ... 
