#!/bin/sh # gdb_now.sh - 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