https://missing.csail.mit.edu/https://missing-semester-cn.g...https://www.bilibili.com/vide...notesdebugging打印调试方式与log日志相比有以下优点:可以将日志写入文件、socket甚至发送到远程服务器而不仅仅是标准输出;日志可以支持严重级别(如INFO、DEBUG、WARN、ERROR等),允许您根据需要过滤日志;对于新发现的问题,很可能您的日志中已经包含了足够的信息,可以帮助您定位问题信息。这是一个用于类演示的带有日志记录的Python程序。ls和grep等程序使用ANSI转义码,这是一系列特殊字符,可使您的shell更改其输出的颜色。#!/usr/bin/envbashforRin$(seq020255);为$(seq020255)中的G做;在$(seq020255)中为B做;做printf"e[38;2;${R};${G};${B}m█e[0m";donedoneone第三方日志系统程序的日志通常存储在/var/log大部分Linux系统使用systemd,它是一个系统守护进程,控制着你系统中的很多事情,比如哪些服务应该启动并运行systemd会存储以特殊格式登录/var/log/journal,可以使用journalctl命令显示这些信息macOS系统在/var/log/system.log中,但是使用系统日志的工具较多,其可以使用logshow显示内容。对于大多数UNIX系统,您还可以使用dmesg命令使用logger读取内核日志此shell程序将日志添加到系统日志中有些工具如lnav提供了更好的方式来显示和浏览日志文件Debugger调试器可以:暂停程序当到达某条线时;逐步执行程序;查看程序崩溃后变量的值;当满足某些条件时暂停程序;其他高级功能。常见的调试器有:pdb:Python的调试器ipdb:一个增强的pdb,它使用IPython作为REPL,并启用tab补全、语法高亮、更好的回溯和更好的内省,同时保留与pdb模块gdb相同的接口(及其改进版本pwndbg)和lldb:C和类C语言的调试器,还可以探索任意进程及其机器状态:寄存器、堆栈、程序计数器等。专用工具跟踪普通二进制程序执行的系统调用:strace(Linux)和dtrace(macOS和BSD),一个名为dtruss的包装器使得dtruss具有与strace类似的接口(更多信息请参见此处)网络数据包分析工具:tcpdump和Wireshark网络开发:Chrome/Firefox的开发者工具根据编码规则输入并分析代码的正确性。大多数编辑器和IDE都支持在编辑界面显示这些工具的分析结果(以及样式检查或安全检查),突出显示警告和错误的位置。这个过程通常称为代码检查。静态分析工具pyflakes:Python的静态分析工具mypy:另一个Python静态分析工具,可以对代码进行类型检查black:所有Python风格检查工具gofmt:Go风格检查工具rustfmt:Rust风格检查工具prettier:JavaScript、HTML和CSS风格检查工具bandit:Python安全检查工具Vim代码linting插件alesyntastic性能分析时序最常用的方法是打印两段代码的时间差,得到执行时间(挂钟时间),比如使用Python的time模块。但是,执行时间也可能会产生误导,因为您的计算机可能同时还在运行其他进程,或者可能在这段时间等待。一般来说,用户时间+系统时间代表你的进程实际消耗的CPU(更详细的解释可以参考这篇文章)。实时-从程序开始到结束实际经过的时间,包括其他进程的执行时间和阻塞所花费的时间(例如等待I/O或网络);User-CPU执行用户代码所花费的时间;Sys-CPU执行时间花在系统内核代码上。例如,尝试执行发出HTTP请求并为其添加时间前缀的命令。当网络不好时,您可能会看到以下输出。请求用了2s完成,但是这个过程只用了15ms的CPU用户时间和12ms的CPU内核时间。$timecurlhttps://missing.csail.mit.edu&>/dev/null`real0m2.561suser0m0.015ssys0m0.012s分析工具(分析器)CPURuby&Python分析器如何工作?大多数情况下,当人们提到分析工具时,他们通常指的是CPU分析工具。以Python的性能分析工具为例:跟踪分析器(tracing)cProfile:函数调用的耗时跟踪。请注意,它显示了每个函数调用的时间。它的速度可能看起来违反直觉,特别是如果您在代码中使用第三方库,因为内部函数调用也被视为函数调用line_profiler:LineProfiler。采样(定期监控你的程序,记录程序堆栈)pyflame内存可能存在内存泄漏对于手动管理内存的语言,如C、C++,你可以使用Valgrind等工具检查GC,Python等语言,Java、JavaScript、memoryprofiler也很有用,因为对于一个对象来说,只要有指向它的指针就不会被回收,可以使用memory-profiler来分析Python代码进行内存分析事件分析如前所述早些时候,strace可以用来跟踪程序执行的系统调用,perf命令可以跟踪和报告特定的系统事件,例如缓存局部性差、大量页面错误或活锁。下面简单介绍一下常用命令:perflist——列出pref可以跟踪的事件;perfstatCOMMANDARG1ARG2-收集与进程或指令相关的事件;perfrecordCOMMANDARG1ARG2-记录命令执行的采样信息并将统计数据存储在perf.data中;perfreport-在perf.data中格式化和打印数据。可视化对于采样分析器,常见的CPU分析数据展示形式是火焰图,在Y轴上展示函数调用关系,在X轴上展示耗时比例。调用图和控制流图可以显示子程序之间的关系,以函数为节点,以函数调用为边。调用图与分析器信息(如调用次数、花费时间等)一起使用时会非常有用,它可以帮助我们分析程序的流程。在Python中,您可以使用pycallgraph生成这些图形。资源监控通用监控htop是top的改进版,常用的快捷键有:
