diff --git a/packaging/PKGBUILD b/packaging/PKGBUILD index 746a398..78021dc 100644 --- a/packaging/PKGBUILD +++ b/packaging/PKGBUILD @@ -1,6 +1,6 @@ # Maintainer: luna pkgname=freeze-watcher -pkgver=0.4.1 +pkgver=0.4.2 pkgrel=1 pkgdesc="Continuously samples system state and snapshots detailed diagnostics when freeze conditions are detected" arch=('any') diff --git a/src/freeze-watcher.sh b/src/freeze-watcher.sh index ca1fa6e..94b8fbf 100755 --- a/src/freeze-watcher.sh +++ b/src/freeze-watcher.sh @@ -254,10 +254,9 @@ capture_snapshot() { fi echo "## D-state processes (with kernel wchan)" # Use the snapshot taken before /proc reads to catch transient blockers. - # Combine 3 rapid samples (~100ms apart) and dedupe by pid. - echo "$dstate_immediate" - echo "$dstate_t1" | grep -vF "$dstate_immediate" 2>/dev/null - echo "$dstate_t2" | grep -vF "$dstate_immediate" | grep -vF "$dstate_t1" 2>/dev/null + # Combine 3 rapid samples (~100ms apart) and dedupe by pid (column 2). + printf '%s\n%s\n%s\n' "$dstate_immediate" "$dstate_t1" "$dstate_t2" \ + | awk 'NF >= 4 && $1=="D" && !seen[$2]++' | head -30 echo if [ "${CAPTURE_KERNEL_STACKS:-1}" = "1" ]; then capture_kernel_stacks