log4cpp和gdb学习

最近的状态:感觉什么都没干但时间过得飞快。

好多要学的课程要写的代码,毕设进度也还不够,加上偶尔打打游戏不想学习,自然花在blog上的时间就更少了。

1 log4cpp

  1. 介绍

最近开始准备写些C++的东西,因为是在linux下所以也没打算用一些IDE,但Debug还是需要的,因为刚入门所以就从常用的log工具log4cpp和调试工具gdb开始学起吧。

log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流、内存字符串队列、文件、回滚文件、调试器、Windows日志、syslog和远程syslog服务器中。
log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致。其类似的支持库还包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(log4p)等。
log4cpp有如下优点:

  • 提供了可扩展的多种日志记录方式
  • 提供了NDC(嵌套诊断上下文),可用于多线程、多场景的跟踪调试
  • 提供了完整的日志动态优先级控制,可随时调整需要记录的日志优先级
  • 可通过配置文件完成所有配置并动态加载
  • 性能优秀,内存占用小,经过编译后的log4cpp.dll大小仅有160kb
  • 代码级的平台无关性,Log4cpp源代码经过编译后,适用于大多数主流的操作系统和开发工具
  • 概念清晰,学习和使用方便,熟练程序员一天之内即可很好地应用log4cpp进行开发
  1. 安装及配置
  • 下载****.tar.gz安装包

  • 解压后进入目录,运行:

    ./configure
    #可能需要root权限
    make
    make check
    make install
    # 默认安装在 /usr/local/下
  1. 使用
g++ test.cpp -llog4cpp -lpthread
#要加上log4cpp和pthread选项,不然会报错
  1. 配置

若官网的测试例子运行不成功,则有可能是因为找不到log4cpp动态库,解决方法:

sudo vim  /etc/ld.so.conf
#文件末尾加入一行:(log4cpp动态库安装位置)
# include /usr/local/lib

不过我一般用的CMake编译,只需要target_link一下就行了,不用改文件。

  1. 自定义

找一个别人封装好的配置文件,拿过来能用就行了,毕竟只是个工具。

  1. 各模块介绍

没时间所以先鸽着。

2 gdb

  1. 介绍:

    GDB(GNU Debugger)是UNIX及UNIX-like下的强大调试工具,可以调试ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal等语言。

  2. 使用配置:

  • 先安装: sudo apt-get install gdb

  • 编译时加上-g选项,否则会出现...(no debugging symbols found)...done.标识
    gdb filename 进入调试界面

  1. 常用命令:
# 打开要调试的程序(若在shell里用gdb指定了目标则不需要用)
file filename


# 回车键默认执行上一条命令


# 查帮助
help command


# 可视化界面
wi
# 或者通过 gdb -tui main 进入
# 温馨提示: sudo apt-get install cgdb 发现新大陆吧
# 不过这种方式安装的cgdb版本可能过低,推荐去github上下载下来编译安装

# cgdb常用命令:
# i 切换到gdb; o 选择要显示的代码文件;
# F5 - Send a run command to GDB.
# F6 - Send a continue command to GDB.
# F7 - Send a finish command to GDB.
# F8 - Send a next command to GDB.
# F10 - Send a step command to GDB.
# 快捷键可以通过cgdbrc自己配置,用起来真的香


# 显示n到n+10行的代码
# list n
l n
#(连续按回车会不断往下显示


# 退出gdb窗口
# quit
q


# 添加断点
# break
# b function_name
# b row_num
# b file_name:row_num
# b row_num if condition


# 查看断点
# info break
i b
# 输出:编号,类型,显示状态,是否启用,地址,其他信息
# an example:
# Num     Type           Disp Enb Address            What
# 1       breakpoint     keep y   0x0000000000001426 in main()
#                                                    at /home/zcp/Desktop/log_gdb_test/testgdb.cpp:7


# 禁用断点
disable Num


# 删除断点
# delete NUm
d Num


# 运行程序
# run
r


# 单步执行(有断点的情况下)
# 需要先运行
# next
n


# 恢复运行
# continue
c

# 跳入与跳出函数
# 需要先在调用函数处设置一断点
# 跳入函数: step
s
# 跳出函数:finish
f


# 打印变量
# print var
p var
# 还可以修改变量值
p var=1
# 打印指针所指内容
p *var
# 如果是数组、则上述只能打印第一个值,需要用@并指定长度
p *[email protected]

# 监控变量
# 必须先运行程序,否则提示`NO symbol`
watch var
info watch


# 查看变量类型
whatis var


# 栈跟踪
# backtrace
bt


# 运行shell命令
# 在命令前加!即可
!ls
# 设置运行参数
set args ...
# 查看运行参数
show args


# 查看当前目录、切换目录
# 和shell命令一样
pwd
cd ..


# 查看运行环境
# show paths
path
# 等效于shell中的echo $PATH


# 查看程序运行状态
# info program
i prog


# 变量自动显示
# display <expr>
disp <expr>
# 要取消则 undisplay
undis
# 或者:
delete display <dnums>
# 显示display欣喜
# info display
i dis


# 继续运行到指定位置
# until num
u num
Author: zcp
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source zcp !
评论
Valine utteranc.es
 Previous
Auto.js编写游戏脚本入门
1 介绍 Auto.js is a UiAutomator on android, does not need root access(安卓平台上的JavaScript自动化工具) 看作者的github ID hyb1996应
Next 
《やはり俺の青春ラブコメはまちがっている》抜粋
1 前書きまず前提として、何年前にこの作品のアニメを見たことがある(今はほぼ忘れた)。日本語を勉強し、そして暇つぶしに何か読もうと思い、何冊のラノベをKindleで購入しました。値段が少し高いだが、読んでいて面白かったから買ってよ
  TOC