lurk

lurk

简洁高效的系统调用跟踪工具

作为strace的替代品,lurk专注于简化系统调用跟踪过程。它支持跟踪进程和命令的系统调用,提供彩色格式化输出和JSON输出选项。lurk保留了strace的核心功能,同时改进了用户界面,使系统调用分析更加直观。无论是执行新命令还是附加到现有进程,lurk都能满足不同场景的需求。

系统调用追踪命令行工具lurk性能分析Linux调试Github开源项目

lurk

CICD

lurkstrace的一个简单而美观的替代品。它允许用户跟踪进程或命令的系统调用。与strace相比,lurk专注于提供简单但美观的用户体验,同时实现了strace最重要的用例。

演示

演示

特性

  • 支持一部分精选的strace标志。
  • 支持JSON输出,便于通过如jq等工具进行进一步处理。
  • 使用彩色格式化输出 ;-)。

安装

cURL

curl -L -o /tmp/lurk.tar.gz "https://github.com/JakWai01/lurk/releases/latest/download/lurk-x86_64-unknown-linux-gnu.tar.gz" tar -xzf /tmp/lurk.tar.gz -C /tmp sudo install /tmp/lurk /usr/local/bin

Cargo

cargo install lurk-cli

Arch Linux

pacman -S lurk

使用方法

要快速了解,可以运行lurk --help

lurk 0.2.7

用法:
    lurk [选项] [命令]...

参数:
    <命令>...    跟踪命令

选项:
    -c, --summary-only
            仅报告摘要,不输出常规内容

    -C, --summary
            除常规输出外,还报告摘要

    -e, --expr <表达式>
            用于修改要跟踪的事件或跟踪方式的限定表达式

    -E, --env <环境变量>
            --env var=val 添加环境变量。--env var 移除环境变量。

    -f, --follow-forks
            跟踪当前跟踪的进程创建的子进程

    -h, --help
            打印帮助信息

    -j, --json
            以JSON格式显示输出

    -n, --syscall-number
            显示系统调用号

    -o, --file <文件>
            指定输出文件名

    -p, --attach <附加>
            附加到正在运行的进程

    -s, --string-limit <字符串限制>
            设置打印的最大字符串大小

    -T, --syscall-times
            显示系统调用花费的时间(毫秒)

    -u, --username <用户名>
            以指定用户名的uid、gid和附加组运行命令

    -v, --no-abbrev
            打印字符串的完整版本,不使用缩写

    -V, --version
            打印版本信息

    -z, --successful-only
            只打印成功返回的系统调用

    -Z, --failed-only
            只打印返回错误代码的系统调用

基本跟踪

跟踪系统调用基本有两种方式。你可以直接执行一个命令,或者通过--attach提供进程ID(PID)来附加到正在运行的进程。后一种情况下,命令需要以提升的权限(sudo)运行。

执行命令

$ lurk ls
[54605] execve("", "", "") = 0
[54605] brk(NULL) = 0x55578000
[54605] arch_prctl(12289, 0xffffe780) = -22
[54605] access("", 4) = -2
[54605] openat(4294967196, "/etc/ld.so.cache", 524288) = 3
[54605] newfstatat(3, "", 0xffffd9a0, 4096) = 0
[54605] mmap(NULL, 92599, 1, 2, 3, 0) = 0xf7fa9000
...

附加到正在运行的进程

$ sudo lurk --attach $PID
[54683] epoll_wait(5, 0xd01a3c20, 8, 4294967295) = -4
[54683] recvmsg(3, 0x4a4a0020, 0) = -11
[54683] recvmsg(3, 0x4a4a0020, 0) = -11
[54683] clock_gettime(1, 0x4a49df40) = 0
[54683] clock_gettime(1, 0x4a4a0220) = 0
[54683] recvmsg(3, 0x4a4a0050, 0) = -11
...

使用--expr进行过滤

strace不同,lurk仅支持--expr trace。由于这个标志的行为几乎与strace中的完全相同,这里简要摘录并稍作修改了strace手册页中关于如何使用lurk --expr trace的说明:

 -e trace=syscall_set
       --trace=syscall_set
              仅跟踪指定的系统调用集合。syscall_set定义为[!]value[,value],
              value可以是以下之一:

              syscall
                     通过名称指定要跟踪的特定系统调用(但请参见注意事项)。

              ?value 系统调用限定前的问号允许在没有匹配到系统调用时抑制错误。

              /regex 仅跟踪匹配正则表达式的系统调用。
                     你可以使用POSIX扩展正则表达式语法(参见regex(7))。

              %file
              file   跟踪所有以文件名作为参数的系统调用。
                     你可以将此视为-e trace=open,stat,chmod,unlink,...的缩写,
                     这对于查看进程引用的文件很有用。此外,使用这个缩写
                     可以确保你不会意外忘记包含像lstat(2)这样的调用。
                     打赌你会忘记这个。不带百分号前缀的语法("-e trace=file")
                     已被弃用。

              %process
              process
                     跟踪与进程生命周期(创建、执行、终止)相关的系统调用。
                     不带百分号前缀的语法("-e trace=process")已被弃用。

              %net
              %network
              network
                     跟踪所有网络相关的系统调用。
                     不带百分号前缀的语法("-e trace=network")已被弃用。

              %signal
              signal 跟踪所有信号相关的系统调用。
                     不带百分号前缀的语法("-e trace=signal")已被弃用。

              %ipc
              ipc    跟踪所有IPC相关的系统调用。
                     不带百分号前缀的语法("-e trace=ipc")已被弃用。

              %desc
              desc   跟踪所有文件描述符相关的系统调用。
                     不带百分号前缀的语法("-e trace=desc")已被弃用。

              %memory
              memory 跟踪所有内存映射相关的系统调用。
                     不带百分号前缀的语法("-e trace=memory")已被弃用。

              %creds 跟踪读取或修改用户和组标识符或能力集的系统调用。

              %stat  跟踪stat系统调用的变体。

              %lstat 跟踪lstat系统调用的变体。

              %fstat 跟踪fstat、fstatat和statx系统调用的变体。

              %%stat 跟踪用于请求文件状态的系统调用
                     (stat、lstat、fstat、fstatat、statx及其变体)。

              %statfs
                     跟踪statfs、statfs64、statvfs、osf_statfs和
                     osf_statfs64系统调用。可以通过-e trace=/^(.*_)?statv?fs
                     正则表达式实现相同效果。

              %fstatfs
                     跟踪fstatfs、fstatfs64、fstatvfs、osf_fstatfs和
                     osf_fstatfs64系统调用。可以通过-e trace=/fstatv?fs
                     正则表达式实现相同效果。

              %%statfs
                     跟踪与文件系统统计相关的系统调用
                     (statfs类、fstatfs类和ustat)。可以通过
                     -e trace=/statv?fs|fsstat|ustat正则表达式实现相同效果。

              %clock 跟踪读取或修改系统时钟的系统调用。

%pure 追踪始终成功且没有参数的系统调用。目前,这个列表包括以下系统调用:arc_gettls(2)、getdtablesize(2)、getegid(2)、getegid32(2)、geteuid(2)、geteuid32(2)、getgid(2)、getgid32(2)、getpagesize(2)、getpgrp(2)、getpid(2)、getppid(2)、get_thread_area(2)(在x86以外的架构上)、gettid(2)、get_tls(2)、getuid(2)、getuid32(2)、getxgid(2)、getxpid(2)、getxuid(2)、kern_features(2)和metag_get_tls(2)。

-c选项对于确定哪些系统调用可能有用于追踪很有帮助。例如,trace=open,close,read,write表示只追踪这四个系统调用。如果只监控一部分系统调用,在推断用户/内核边界时要小心。默认设置是trace=all。

注意:在使用bash时,如果用"!"来否定一个语句,确保对其进行转义("!")。

过滤不包含字母"o"的系统调用

$ lurk --expr trace=\!/o ls
[55155] execve("", "", "") = 0
[55155] brk(NULL) = 0x55578000
[55155] arch_prctl(12289, 0xffffe780) = -22
[55155] access("", 4) = -2
[55155] newfstatat(3, "", 0xffffd9a0, 4096) = 0
[55155] mmap(NULL, 92599, 1, 2, 3, 0) = 0xf7fa9000
[55155] read(3, "\u{7f}ELF\u{2}\u{1}\u{1}", 832) = 832
...

只过滤以文件为参数的所有系统调用

$ lurk --expr trace=%file ls
[55121] access("", 4) = -2
[55121] openat(4294967196, "/etc/ld.so.cache", 524288) = 3
[55121] newfstatat(3, "", 0xffffd9a0, 4096) = 0
[55121] openat(4294967196, "/usr/lib/libcap.so.2", 524288) = 3
[55121] newfstatat(3, "", 0xffffd9a0, 4096) = 0
[55121] openat(4294967196, "/usr/lib/libc.so.6", 524288) = 3
[55121] newfstatat(3, "", 0xffffd980, 4096) = 0
...

抑制prctl系统调用的错误

$ lurk --expr trace=?prctl ls
[55407] execve("", "", "") = 0
[55407] brk(NULL) = 0x55578000
[55407] arch_prctl(12289, 0xffffe780) = -22
[55407] access("", 4) = -2
[55407] openat(4294967196, "/etc/ld.so.cache", 524288) = 3
[55407] newfstatat(3, "", 0xffffd9a0, 4096) = 0
[55407] mmap(NULL, 92599, 1, 2, 3, 0) = 0xf7fa9000

只输出openat、close和mmap系统调用

$ lurk --expr trace=openat,close,mmap ls
[55440] openat(4294967196, "/etc/ld.so.cache", 524288) = 3
[55440] mmap(NULL, 92599, 1, 2, 3, 0) = 0xf7fa9000
[55440] close(3) = 0
[55440] openat(4294967196, "/usr/lib/libcap.so.2", 524288) = 3
[55440] mmap(NULL, 8192, 3, 34, 4294967295, 0) = 0xf7fa7000
[55440] mmap(NULL, 45128, 1, 2050, 3, 0) = 0xf7f9b000
[55440] mmap(0xf7f9e000, 20480, 5, 2066, 3, 12288) = 0xf7f9e000

作为Rust库使用

请参阅tracer示例。

致谢

  • sharkdp/fd作为如何构建Rust CLI及其README的灵感。
  • 所有用于创建lurk的依赖项的维护者,以及所有回答我关于ptrace问题的人。

许可证

lurk (c) 2022-2023 Jakob Waibel, Yuri Astrakhan及贡献者

SPDX-License-Identifier: MIT OR Apache-2.0

编辑推荐精选

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

下拉加载更多