| 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 |