Japin

登高必自卑,行远必自迩

SystemTap 为 Linux 内核和用户态程序提供了动态跟踪功能。用户可以自定义探测事件来跟踪程序的运行情况,如函数调用栈、系统调用以及其他事件。SystemTap 可以在不修改代码、甚至是不需要重启的情况下就能分析程序的运行情况。

SystemTap 的基本思想是命名事件,以及事件对应的处理程序。当运行 SystemTap 脚本时,SystemTap 会监视事件;一旦事件发生,Linux 内核就会将处理程序作为子例程运行,然后继续运行。SystemTap 有几种事件:进入/退出函数、计时器到期、会话开始/终止等。处理程序是一系列脚本语句,指定事件发生时要执行的工作。这项工作包括从事件上下午中提取数据,将其存储到内部变量中,打印结果。

SystemTap 的工作原理是将 SystemTap 脚本翻译成 C 语言,然后将其编译为内核模块,并加载到内核中并启用脚本中的探测点;当相应的事件发生时,事件对应的处理程序被执行;一旦 SystemTap 会话结束,探测点将被禁用,内核模块也被卸载。下图是 SystemTap 的处理过程。

图片来源于 Architecture of systemtap: a Linux trace/probe tool

阅读全文 »

Git bisect 二分查找实践这篇文章中我们知道了如何通过 git bisect 来进行快速定位,但是,我们需要手动的去执行测试命令以确定哪个提交是正常的,哪个提交是异常的。本文记录了如何将 git bisect 的二分查找自动化。

阅读全文 »

Checkpointer 进程负责将 PostgreSQL 数据库中的脏页刷到磁盘中,当我们通过 GDB 附加到 checkpointer 进程之后,通过执行 CHECKPOINT 语句发现不能触发后续的 checkpoint 代码。本文针对这个问题简要介绍一下如何调试 PostgreSQL 数据库的 checkpointer 进程。

阅读全文 »

内存泄露又来啦!这次的主角是 tmux。我在升级 tmux 到 3.4 之后,并在 tmux 绘画中使用 fzf 时,出现了如下内存泄露。

1
2
3
4
5
6
7
8
9
10
11
12
=================================================================
==367944==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 2 byte(s) in 1 object(s) allocated from:
#0 0x4855e4 in strdup (/usr/local/bin/tmux+0x4855e4)
#1 0x84d104 in xstrdup /home/japin/Codes/tmux/xmalloc.c:93:12
#2 0x5170d8 in cmd_parse_from_arguments /home/japin/Codes/tmux/cmd-parse.y:1075:11
#3 0x4e10df in client_main /home/japin/Codes/tmux/client.c:267:8
#4 0x768190 in main /home/japin/Codes/tmux/tmux.c:519:7
#5 0x7fe9db1fe082 in __libc_start_main /build/glibc-SzIz7B/glibc-2.31/csu/../csu/libc-start.c:308:16

SUMMARY: AddressSanitizer: 2 byte(s) leaked in 1 allocation(s).
阅读全文 »

本文简要记录一个由 psql 提供的 \copy 元命令引发的错误,如下所示:

1
2
3
4
5
postgres=# \copy tbl FROM '/tmp/tbl.csv' WITH csv;
ERROR: unterminated CSV quoted field
CONTEXT: COPY tbl, line 1: ""
\.
"
阅读全文 »

本图片来自于 The Art of Debugging with GDB, DDD, and Eclipse 1st Edition, Kindle Edition 的封面

今天在调试程序的时候遇到了 GDB 导致的 segfault,感觉还挺有意思的,因此在这里做一个简要记录。

阅读全文 »

PostgreSQL 允许数据库会话同步它们的快照。快照确定哪些数据对使用快照的事务可见。当两个或多个会话需要查看数据库中的相同内容时,需要同步快照。如果两个会话只是独立地开始它们的事务,在两个 START TRANSACTION 命令的执行之间总是有可能提交第三个事务,这样一个会话可以看到该事务的效果,而另一个则看不到。

为了解决这个问题,PostgreSQL 允许事务导出它正在使用的快照。只要导出快照的事务保持打开状态,其他事务就可以导入这个快照,从而保证它们看到的数据库视图与第一个事务看到的完全相同。

快照可以通过 pg_export_snapshot() 函数导出,并通过 SET TRANSACTION 命令导入。本文我将从源码角度分析一下快照导出和导入的流程。

阅读全文 »

最近在使用 IRC 的时候发现 Emacs 的 ERC 不能登录 IRC 了,提示如下错误信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Opening connection..                                                    [13:47]
-zinc.libera.chat- *** Checking Ident
-zinc.libera.chat- *** Looking up your hostname...
-zinc.libera.chat- *** No Ident response
-zinc.libera.chat- *** Couldn't look up your hostname
-zinc.libera.chat- *** Notice -- SASL authentication to a NickServ account
with a verified email address is required to connect from
your current network. Please see
https://libera.chat/guides/sasl for configuration assistance.
==> ERROR from irc.libera.chat: Closing Link: 117.139.163.129 (SASL
authentication to a NickServ account with a verified email address is
required to connect from your current network. Please see
https://libera.chat/guides/sasl for configuration assistance.)


Connection failed! Not re-establishing connection.


*** ERC terminated: connection broken by remote peer
阅读全文 »
0%