summaryrefslogtreecommitdiffstats
path: root/tools/guest-diag/gdb_now.sh
blob: 4aa394e436d226307b43c4b35ea41b7e67397670 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/sh
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2026 Open-IOV contributors
# gdb_now.sh <pid> - attach gdb once immediately (root), dump all threads,
# detach, CONT. Used when the host has seen the final RM control, so the
# attach is timed to the post-control window instead of state sampling.
PID="$1"
LOG="${2:-/tmp/gdbbt2.log}"
: > "$LOG"
{
    echo "=== FORCED $(date +%T.%3N) pid=$PID ==="
    for t in /proc/$PID/task/*; do
        echo "--- thread $(basename $t): $(awk '{print $3}' $t/stat 2>/dev/null) $(cat $t/comm 2>/dev/null) syscall=$(cat $t/syscall 2>/dev/null | cut -d' ' -f1-2)"
        cat "$t/stack" 2>/dev/null | sed 's/^/    kstack: /'
    done
    grep -E "libcuda|nvidia" /proc/$PID/maps | head -4
} >> "$LOG" 2>&1
timeout 90 gdb -p "$PID" -batch \
    -ex "set pagination off" -ex "set height 0" -ex "set confirm off" \
    -ex "info threads" \
    -ex "thread apply all bt 12" \
    -ex "thread apply all info registers rip rsp rbp rbx rax rdi rsi rdx rcx r8 r9" \
    -ex "thread apply all x/10i \$pc" \
    >> "$LOG" 2>&1
echo "=== GDB DONE $(date +%T.%3N) ===" >> "$LOG"
kill -CONT "$PID" 2>/dev/null