Warning: this is an htmlized version!
The original is across this link,
and the conversion rules are here.
# attachgdb - version 2001jan17 - by Edrx (edrx@inx.com.br)
# This script checks its parent process, then its grandparent process,
# etc, etc, until it finds one with a given name, "make", say; then it
# calls gnudoit to make the current emacs session attach a gdb to its
# pid. Note that sometimes (in some cases 50% of the times) gdb fails
# to attach to that pid, claiming "ptrace: no such process."; I don't
# know the cause of this, so be ready to run your gdbattach-calling
# program multiple times.
# The first parameter to this script is name of the program to attach
# gdb to, the others are passed literally to gdb; see "%opts" below.
# Note that we use the /proc/xxx/stat files, which are Linux-specific.
# (find-k22file "fs/proc/array.c" "static int get_stat(")
# (eeman "5 proc" "stat")

proc readfile {fname} {
  set f [open $fname r]; set s [read $f]; close $f
  return $s

proc ancestorpid {progname} {
  for {set dirid self} {$dirid!="0"} {set dirid $ppid}  {
    scan [readfile /proc/$dirid/stat] "%d %s %c %d" pid comm state ppid
    if {$comm=="($progname)"} {
      return $pid
  error "Process not found"

proc gnudoit {lispcode} {
  puts $lispcode
  puts [exec gnudoit $lispcode]

# (find-angg "eev-extras.el" "gdbk-mode")
proc gdbk-gdb {args} {
  gnudoit "(gdbk-gdb nil \"$args\")"

puts [join $argv]
eval [join $argv]

#Obsolete notes:
# set elisp0 {(gdb "gdb --silent %path %pid")}
# set path [lindex $argv 0]
# set opts [join [lrange $argv 1 end]]
# set pid [ancestorpid [file tail $path]]
# set elisp "gdb \"$opts $path $pid\""
# gnudoit $elisp