每秒百万级高效 C++ 异步日志实践_LeechanXBlog 的博客 - CSDN 博客

异步日志,按我的理解就是主线程的日志打印接口仅负责生产日志数据(作为日志的生产者),而日志的落地( 写入文件 )操作留给另一个后台线程去完成(作为日志的消费者),这是一个典型的生产 - 消费问题,如此一来会使得:

主线程调用日志打印接口成为非阻塞操作,同步的磁盘 IO 从主线程中剥离出来,有助于提高性能

对于异步日志,我们很容易借助队列来一个实现方式:主线程写日志到队列,队列本身使用条件变量、或者管道、eventfd 等通知机制,当有数据入队列就通知消费者线程去消费日志

但是,这样的异步队列也有一定的问题:

  • 生产者线程产生 N 个日志,对应后台线程就会被通知 N 次,频繁日志写入会造成一定性能开销
  • 不同队列实现方式也各有缺点:
    • 用数组实现:空间不足时,队列内存不易拓展
    • 用链表实现:每条消息的生产消费都对应内存的创建销毁,有一定开销

gdb官方文档

GDB Documentation (sourceware.org)

gdb 调试过程

要使用 g++ 和 GDB 进行调试,请按照以下步骤操作:

  1. 编译代码:首先,使用 g++ 命令来编译你的代码,并添加 -g 选项以生成带有调试符号的可执行文件。例如:

    1
    2
    3
    4
    5
    
    g++ -g your_code.cpp -o your_program
    
    // 如果是使用cmake, 在 makelists.txt 加上这两句话
    set(CMAKE_BUILD_TYPE DEBUG)
    add_definitions(-g)
    
  2. 启动 GDB:在终端中输入 gdb 命令,然后在 GDB 提示符下启动你的程序,如下所示:

    1
    
    gdb your_program
    
  3. 设置断点:在 GDB 中,你可以使用 break 命令设置断点。例如,要在主函数的第 10 行设置断点,可以键入:

    1
    
    break main.cpp:10
    
  4. 运行程序:输入 run 命令来运行程序。当程序达到断点时,它会停止执行

    1
    
    run
    
  5. 执行调试命令:一旦程序停止在断点处,你可以使用各种 GDB 命令来检查变量的值、单步执行代码等。

    • 使用 next 命令(简写为 n)逐行执行代码,而不进入函数调用。
    • 使用 step 命令(简写为 s进入函数调用并逐行执行函数内部的代码。( 常用 )
    • 使用 print 命令(简写为 p)打印变量的值。
    • 使用 continue 命令(简写为 c)继续执行程序直到下一个断点。

    你还可以使用其他的 GDB 命令进行更高级的调试操作。

  6. 退出 GDB:要退出 GDB,可以使用 quit 命令或按下 Ctrl + D

以上是使用 g++ 和 GDB 进行调试的基本步骤。你可以根据具体需求和调试情况来使用其他 GDB 命令。

常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
r:run,执行程序
n:next,下一步,不进入函数
s:step,下一步,会进入函数
b:breakponit,设置断点
l:list,查看源码
c:continue,继续执行到下一断点
bt:backtrace,查看当前调用栈
p:print,打印查看变量
print (variable)
q:quit,退出 GDB
whatis:查看对象类型
info threads:查看线程
info breakpoints (info b):查看所有的断点
info locals:查看局部变量
info args:查看函数的参数值及要返回的变量值
info frame:堆栈帧信息


(1) 查看可切换调试的线程:info threads
(2) 切换调试的线程:thread 线程 id
(3) 只运行当前线程:set scheduler-locking on
(4) 运行全部的线程:set scheduler-locking off
(5) 指定某线程执行某 gdb 命令:thread apply 线程 id gdb_cmd
(6) 全部的线程执行某 gdb 命令:thread apply all gdb_cmd
Licensed under CC BY-NC-SA 4.0
最后更新于 Oct 22, 2024 12:42 UTC
使用 Hugo 构建
主题 StackJimmy 设计