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进程查看,内存分析工具的更多相关文章

  1. 在linux中如何调试C语言程序

    在Linux下面可以使用下面几种形式对C语言进行调试: 1 gdb gdb program 这是最原始的调试方法,若非熟悉命令行,这种方式其实是比较麿人的.有兴趣的可以参考一些我之前的博文.http: ...

  2. Linux运维基础入门(四):Linux中的网络知识04

    一,虚拟机的安装 略 二,Linux系统下的网络配置(Linux虚拟机的网络设定为桥接模式) 桥接模式:虚拟机同主机一样,在网络中相当于一个真实存在的装有Linux系统的电脑.(我们先用这个模式) N ...

  3. linux中的正则表达式知识梳理

    1. 正则表达式 1.1 正则表达式使用 正则表达式是开发者为了处理大量的字符串和文本而定义的一套规则和方法,使用正则表达式可以提高效率,快速获取想要的内容. 正则表达式常用于linux三剑客grep ...

  4. linux中的shell编程----基础

    1,运行shell脚本有两种办法一般有两种: 先给可执行权限,再进入文件所在的目录,输入:./name.sh: 运行解释器再执行脚本:/bin/sh name.sh,这种情况下,脚本中可以没有#!/b ...

  5. linux中uptime命令获取主机运行时间和查询系统负载信息

    系统中的uptime命令主要用于获取主机运行时间和查询linux系统负载等信息.uptime命令可以显示系统已经运行了多长时间,信息显示依次为:现在时间.系统已经运行了多长时间.目前有多少登陆用户.系 ...

  6. java基础知识回顾之---java String final类 容易混淆的java String常量池内存分析

    /** *   栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放  在常量池中). 堆(heap):存 ...

  7. 操作系统复习——如何查看一个进程的详细信息,如何追踪一个进程的执行过程 ,如何在 Linux 系统下查看 CPU、内存、磁盘、IO、网卡情况?epoll和select区别?

    1. 如何查看一个进程的详细信息,如何追踪一个进程的执行过程 通过pstree命令(根据pid)进行查询进程内部当前运行了多少线程:# pstree -p 19135(进程号) 使用top命令查看(可 ...

  8. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  9. 【转】Linux基础与Linux下C语言编程基础

    原文:https://www.cnblogs.com/huyufeng/p/4841232.html ------------------------------------------------- ...

随机推荐

  1. 怎样创建.NET Web Service http://blog.csdn.net/xiaoxiaohai123/article/details/1546941

    为什么需要Web Service 在通过internet网购买商品后,你可能对配送方式感到迷惑不解.经常的情况是因配送问题找配送公司而消耗你的大量时间,对于配送公司而言这也不是一项增值服务. 为了解决 ...

  2. leetCode 104.Maximum Depth of Binary Tree(二叉树最大深度) 解题思路和方法

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  3. H5 手机横竖屏判读

    $.fn.screenCheck = function() { var pDiv = $('<div></div>'); pDiv.addClass("screenC ...

  4. 转_Greenplum 数据库安装部署(生产环境)

    Greenplum 数据库安装部署(生产环境) 硬件配置: 16 台 IBM X3650, 节点配置:CPU 2 * 8core,内存 128GB,硬盘 16 * 900GB,万兆网卡. 万兆交换机. ...

  5. Java中Class.forName()的作用(转载)

    http://www.360doc.com/content/10/0712/10/1720440_38421273.shtml# 使用jdbc方式连接数据库时会使用一句代码Class.forName( ...

  6. SQL还原数据库后,数据库显示受限制用户解决方法

    数据库->属性->选项

  7. pygame 安装教程

    步骤: 1.去官网下载PyGame 注意:要下载对应版本的包 官网地址:http://www.pygame.org/download.shtml 其中,如果python为以下版本: python 3. ...

  8. java集合类学习心得

    java集合类学习心得 看了java从入门到精通的第十章,做个总结,图片均取自网络. 常用集合的继承关系 Linked 改快读慢 Array 读快改慢 Hash 两都之间 Collection是集合接 ...

  9. requests 中文乱码

    jsUrl = 'http://www.heze.cn/qiye/index.php?a=userinfo&username={}'.format(bizQiyeId)r = requests ...

  10. ABAP读取工单状态 STATUS_READ

    *&---------------------------------------------------------------------* *& Report YDEMO_013 ...