#!/usr/bin/expect -f
#
# Dump the threads of the specified program.
#

proc prompt1 {} {send_user ""}

if {[llength $argv] != 3} {
    puts "usage: $argv0 gDB_executable program pID_or_core_file"
    exit 1
}

#set timeout 1
eval spawn "$argv"
expect {
    "to continue" {send "\r" ; exp_continue}
    "(gdb)" {send "set height 0\r"}
}
expect "(gdb)"

send_user "\n\r\n\r\n\r\n\r"
send "info threads\r"
expect "(gdb)"

send_user "Start of thread and locals dump\n\r"
for {set i 1} {$i<1000} {incr i} {
    send_user "\n\r\n\r\n\r\n\r"
    send "thread $i\r"
    log_user 0
    expect "(gdb)"
    log_user 1
#   send_user "Read:$expect_out(buffer)\r"
    if {[string first "not known" $expect_out(buffer)] > 0} {
# Avoid the message above eventually???
#       send_user "exit!!!!!\r";
        break;
    } else {
	send_user "$expect_out(buffer)\r"
        send "bt\r";
        expect "(gdb)";

        for {set j 0} {$j<1000} {incr j} {
            send "frame $j\r"
	    log_user 0
            expect "(gdb)"
	    log_user 1
        #   send_user "Read:$expect_out(buffer)\r"
            if {[string first "0x00000000 in ??" $expect_out(buffer)] > 0 || 
                [string first "Cannot access memory" $expect_out(buffer)] > 0} {
# Avoid the message above eventually???
        #       send_user "exit!!!!!\r";
                break;
            } else {
                send_user "\n\r======================================================\n\r"
	        send_user "$expect_out(buffer)\r"
                send "info locals\r";
                expect "(gdb)";
            }
        }

    }
}
send_user "End of thread and locals dump\r";

log_user 0
send "set height 24\r";
expect "(gdb)";
send "quit\r";
expect "(y or n)";
log_user 1
send "y\r";
exit 0;
