什么是Debugging

在维基百科上,Debugging的定义是:Debugging is the process of finding and resolving defects or problems within a computer program that prevent correct operation of computer software or a system.

简单来讲,就是找问题,查问题。

代码 Debugging

Windows

WinDgb

Linux

gdb binary corefile

Mac

LLDB Debugger

Java

HotSpot VM的Native Memory Tracking

java8给HotSpot VM引入了Native Memory Tracking (NMT)特性,可以用于追踪JVM的内部内存使用

使用-XX:NativeMemoryTracking=summary可以用于开启NMT,其中该值默认为off,可以设置summary、detail来开启;开启的话,大概会增加5%-10%的性能消耗;使用-XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics可以在jvm shutdown的时候输出整体的native memory统计;其他的可以使用jcmd pid VM.native_memory相关命令进行查看、diff、shutdown等

Static Code Analysis

Lint

静态程序分析工具

coredump分析

核心转储(core dump)是程序在遇到严重错误时由操作系统生成的,用于保存程序异常终止时的内存镜像。这种机制主要用于后续的调试和分析,以确定程序崩溃的原因。产生核心转储的信号有很多,以下是一些常见的信号:

1. SIGSEGV (信号 11)

2. SIGABRT (信号 6)

3. SIGFPE (信号 8)

4. SIGILL (信号 4)

5. SIGBUS (信号 7)

6. SIGQUIT (信号 3)

7. SIGTRAP (信号 5)

这些信号中的每一个都指示了程序运行中遇到的特定类型的错误。理解这些信号及其背后的原因对于调试和解决问题至关重要。使用调试器(如GDB)可以帮助开发者更精确地定位问题的源头,并分析程序崩溃的原因。

状态 Debugging

http://www.brendangregg.com/linuxperf.html

性能 Debugging

如何高效的衡量程序性能?

火焰图 Flame Graph

sudo yum install perf
perf record -F 99 -p 进程号 -g -- sleep 秒数
perf script > out.perf

git clone https://github.com/brendangregg/FlameGraph.git
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > out.svg

对一个机器进行快速体检

http://www.brendangregg.com/Articles/Netflix_Linux_Perf_Analysis_60s.pdf

10个命令,对一个机器的负载情况进行快速体检

Reference

https://en.wikipedia.org/wiki/Debugging

Brendan Gregg

最全的Java服务问题排查套路

*****
Written by Lu.dev on 16 December 2018