首页 > 其他分享 >日志二

日志二

时间:2022-09-26 22:24:58浏览次数:66  
标签:LinkQue int data next front 日志 断点


一、gdb编译方式

与编译单个文件类似,只需将多个文件同时包含进去,以g++执行命令为例:
g++ -o codefile main.cpp student.cpp
运行命令:
./codefile

  • 当然这种方式不便于程序的动态维护,每次修改当个源程序都要重新编译整个代码文件,因此只适用于编译少量文件

二、Make编译方式

pass

三、GDB调试

3.1 gdb执行命令

本文调试以双端队列.exe可执行文件为例进行gdb代码调试
此处应注意在编译源文件时一定要加上-g选项,以便能够正常调试程序
最简单的一种执行命令: gdb 程序名
启动调试程序: gdb 双端队列,执行成功后gdb界面如下:
本地图片

<1> 代码查看命令 list及相关操作
执行命令 执行效果
listl或回车 默认展示出10行代码
l 行号 展示当前行前后各五行的代码
l - 查看上一个l命令查看的代码的前10行
l 行号 行号 查看指定行范围内的代码
l 函数名 查看对应函数的代码
<2> 程序运行命令

运行程序命令:r 即可运行整个程序
程序退出命令:q 即可中断退出程序
继续执行命令:c 即continue,表示程序在遇到断点后停止再继续运行时的命令

<3> 命令行参数

当需要对程序通过命令行传入参数时,在gdb中需要另外指定传入的参数,执行命令为 :
set args 参数一 参数二
在此运行 r 命令,即可启动程序

3.2 gdb断点管理

<1> 设置断点

普通断点

设置普通断点通常有两种方式,第一种针对单个源程序,其命令为
b 行号 # break 简写为b, 当然break也可以
第二种方式针对指定文件设置断点,其命令为
b 双端队列.cpp:行号
再次运行程序便会在指定断点处停止执行,此时可以查看断点附近代码
执行命令 l,便会显示在断点前后五行的代码
查看变量的值其命令为
print 变量 # print可简写为p

函数断点

注:其实函数断点也是普通断点的一种,主要是考虑在执行功能上两者又有很大区别,所以本文对两者进行非类探讨
函数断点设置语法:break 函数名
说明,在处理多个同名但是参数不同的函数时,gdb会为所有同名函数都设置断点,因为这样不论调用哪个函数,都会被中断。
指定特定同名函数设置断点
当然如果不想对所有同名函数都设置断点,而只针对某一个函数设置断点,可以通过指定函数,具体命令如下:
b test_1::test_fun
b test_fun(int)
第一种是在类里面的指定函数,第二种通过区分参数类型来判断特定函数
本文所用调试代码

#include<iostream>
#include<cstdlib>
#include<random>
#include<ctime>
const int Nnum = 999;
using namespace std;
/*----------双端队列(Deque)-------/
/*-------变式——输出受限或输入受限的双端队列:限制其中一个端点的插入或删除操作-----
----------(此类形式不作赘述)-------*/
/*限定插入和删除操作只能在端点处进行*/
typedef struct Qnode {
    int data;
    struct Qnode* next;
}Qnode, * QuePtr;
typedef struct {
    QuePtr front; // 队列头指针
    QuePtr rear;   // 队列尾指针
}LinkQue;
// 对应相关操作
bool InitQueue(LinkQue& Q);
bool Push_Front(LinkQue& Q, int e);
bool Push_Back(LinkQue& Q, int e);
int Pop_Front(LinkQue& Q);
int Pop_Back(LinkQue& Q);
bool ClearQueue(LinkQue& Q);
int QueueLength(LinkQue Q);
int GetHead(LinkQue Q);
int GetRear(LinkQue Q);
bool QueuePrint(LinkQue Q);

int main()
{
    srand(time(NULL));//设置随机数种子,使每次产生的随机序列不同
    int N = 30;
    // 创建一个双端队列
    LinkQue Q;
    if (!InitQueue(Q)) return 0;
    for (int i = 0; i < N; i++) {
        if (rand() % (Nnum + 1) / (float)(Nnum + 1) < 0.5) Push_Back(Q, i + 1);
        else Push_Front(Q, i + 1);
    }
    QueuePrint(Q);
    for (int i = 0; i < N / 2; i++) {
        if (rand() % (Nnum + 1) / (float)(Nnum + 1) < 0.5) {
            int e = Pop_Back(Q);
            if (e == -1) continue;
            else cout << "Pop element back: " << e << endl;
        }
        else {
            int e = Pop_Front(Q);
            if (e == -1) continue;
            else cout << "Pop element head: " << e << endl;
        }
    }
    QueuePrint(Q);
    return 0;
}
// 初始化队列的生成
bool InitQueue(LinkQue& ptr)
{
    ptr.front = (QuePtr)malloc(sizeof(Qnode));
    if (!ptr.front) return false;
    ptr.rear = ptr.front;
    ptr.front->data = 0;
    ptr.front->next = NULL;
    return true;
}
/*----------------------------------------*/
// 元素队首入队列
bool Push_Front(LinkQue& Q, int e)
{
    QuePtr p = (QuePtr)malloc(sizeof(Qnode));
    if (!p) return false;
    p->data = e;
    p->next = Q.front->next;
    Q.front->next = p;
    Q.front->data++;   //更新队列长度
    if (Q.front == Q.rear) Q.rear = p;  // 特判初始状态
    return true;
}
// 元素队尾入队列
bool Push_Back(LinkQue& Q, int e)
{
    QuePtr p = (QuePtr)malloc(sizeof(Qnode));
    if (!p) return false;
    p->data = e;
    p->next = NULL;
    Q.rear->next = p;
    Q.rear = p;
    Q.front->data++;   //更新队列长度
    return true;
}
/*------------------------------------*/
/*------------------------------------*/
int Pop_Front(LinkQue& Q)
{
    //首先判断队列是否为空
    if (Q.front == Q.rear) return -1;
    QuePtr p = Q.front->next;
    int e = p->data;
    Q.front->next = p->next;
    // 对最后一个元素进行特判
    if (Q.rear == p) Q.rear = Q.front;
    free(p);
    Q.front->data--;
    return e;
}
int Pop_Back(LinkQue& Q)
{
    //首先判断队列是否为空
    if (Q.front == Q.rear) return -1;
    QuePtr p = Q.front;
    while (p->next != Q.rear) p = p->next;
    int e = Q.rear->data;
    free(Q.rear);
    p->next = NULL;
    Q.rear = p;
    Q.front->data--;
    return e;
}
/*----------------------------------*/
bool ClearQueue(LinkQue& Q)
{
    QuePtr p = Q.front->next;
    while (p) {
        p->data = 0;
        p = p->next;
    }
    return true;
}
int QueueLength(LinkQue Q)
{
    return Q.front->data;
}
int GetHead(LinkQue Q)
{
    return Q.front->next->data;
}
int GetRear(LinkQue Q)
{
    return Q.rear->data;
}
bool QueuePrint(LinkQue Q)
{
    QuePtr p = Q.front->next;
    if (!p) {
        cout << "Empty Queue!" << endl;
        return true;
    }
    cout << "The length of deque: " << QueueLength(Q) << endl;
    cout << "Deque head element: " << GetHead(Q) << ' ' << "Deque end element: " << GetRear(Q) << endl;
    cout << "Deque elements:" << endl;
    while (p) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
    return true;
}

标签:LinkQue,int,data,next,front,日志,断点
From: https://www.cnblogs.com/MarkStiff/p/16732731.html

相关文章

  • 51单片机学习日志一:流水灯和定时器
    单片机最小系统的三要素就是电源、晶振、复位电路单片机复位一般是3种情况:上电复位、手动复位、程序自动复位。没有电压差就不会产生电流一、sbit在单片机中的使用C5......
  • 使用appsettings.json配置和依赖注入调用Serilog日志模块
    appsettings.json配置Serilog{//"Logging":{//"LogLevel":{//"Default":"Information",//"Microsoft.AspNetCore":"Warning"//}//},......
  • Oracle存储过程中,调用另外一个存储过程打印日志
    最近在项目中维护一个三方写的老破旧项目,居然在项目中大量用存储过程书写逻辑,在维护过程中不停的要去查看阅读对方写的存储过程是一个什么逻辑,使用DataGrip的断点功能尝试......
  • ARMS实践|日志在可观测场景下的应用
    简介: 在实际生产中,通过灵活组合文内几种使用方式,运维团队可以很好地排除日常观测、故障定位过程中的干扰因素,更快的定界甚至定位问题根因。作者:陈陈 日志在......
  • MySQL slow log 慢日志
    sql慢日志用于记录执行时间超过指定阈值的SQL,对于系统性能和故障排错非常有帮助开启sql慢日志--开启slowlogset@@global.slow_query_log=1;--设置slowlog文件名,默......
  • 封装日志Mylogger
    importloggingimportosfromCommon.handle_pathimportlogs_dirfromCommon.handle_configimportconfclassMyLogger(logging.Logger):def__init__(self,f......
  • rsync 同步日志到备份机器
    检查是否安装软件[root@test~]#rpm-qa|greprsyncrsync-3.1.2-10.el7.x86_64 服务器配置cat/etc/rsyncd.confuid=rootgid=rootusechroot=noma......
  • 打印 Logger 日志时,需不需要再封装一下工具类?
    在开发过程中,打印日志是必不可少的,因为日志关乎于应用的问题排查、应用监控等。现在打印日志一般都是使用slf4j,因为使用日志门面,有助于打印方式统一,即使后面更换日志框架,......
  • 6.Springboot切换日志框架
    1.Springboot默认使用logback2.切换到log4j2org.springframework.bootspring-boot-starter-webspring-boot-starter-loggingorg.springframework.bootorg.s......
  • tomcat 访问日志转json
    一、安装jdk、tomcatcat install_tomcat.sh #!/bin/bashJDK_FILE="jdk-8u341-linux-x64.tar.gz"#JDK_FILE="jdk-8u281-linux-x64.tar.gz"TOMCAT_FILE="apache-tomc......