master
sh 73 lines 1.46 KB
Raw
1 #! /bin/bash
2
3 set -ue
4
5 if [ $(whoami) != "root" ]; then
6 echo "This script must be run as root in the debug shell (via wsl.exe -u root --debug-shell)"
7 exit 1
8 fi
9
10 dmesg
11
12 # Try to install gdb
13
14 if [ "${dump:-0}" == 1 ]; then
15 tdnf install -y gdb || true
16 fi
17
18 declare -a pids_to_dump
19
20 for proc in /proc/[0-9]*; do
21 read -a stats < "$proc/stat" # Skip kernel threads to make the output easier to read
22 flags=${stats[8]}
23
24 if (( ("$flags" & 0x00200000) == 0x00200000 )); then
25 continue
26 fi
27
28 pid=$(basename "$proc")
29
30 if [ "${dump:-0}" == 1 ]; then
31 pids_to_dump+=("$pid")
32 fi
33
34 parent=$(ps -o ppid= -p "$pid")
35
36 echo -e "\nProcess: $pid (parent: $parent) "
37 echo -en "cmd: "
38 cat "/proc/$pid/cmdline" || true
39 echo -e "\nstat: "
40 cat "/proc/$pid/stat" || true
41
42 for tid in $(ls "/proc/$pid/task" || true); do
43 echo -n "tid: $tid - "
44 cat "/proc/$pid/task/$tid/comm" || true
45 cat "/proc/$pid/task/$tid/stack" || true
46 done
47
48 echo "fds: "
49 ls -la "/proc/$pid/fd" || true
50 done
51
52 for pid in "${pids_to_dump[@]}" ; do
53 name=$(ps -p "$pid" -o comm=)
54 if [[ "$name" =~ ^(bash|login)$ ]]; then
55 echo "Skipping dump for process: $name"
56 continue
57 fi
58
59 echo "Dumping process: $name ($pid) "
60 if gcore -a -o core "$pid" ; then
61 if ! /wsl-capture-crash 0 "$name" "$pid" 0 < "core.$pid" ; then
62 echo "Failed to dump process $pid"
63 fi
64
65 rm "core.$pid"
66 fi
67 done
68
69 echo "hvsockets: "
70 ss -lap --vsock
71
72 echo "meminfo: "
73 cat /proc/meminfo