Create a week13 subdirectory in your weeklylab subdirectory and copy over some files:
cd cs31/weeklylab pwd mkdir week13 ls cd week13 pwd cp ~newhall/public/cs31/week13/* . ls Makefile deadlock.c hello.c racecond.c run.sh*Then type make to build the executable files.
The first line in a script file specifies which shell program to run (the /bin/bash shell in this example):
#!/bin/bashThe remaining lines show two examples of how to express loops in bash: the first over a set of values; the second is much like a C for loop.
To run a script, you need to make sure the file permissions on the script file are executable:
ls -l run.sh -rwx------ run.shIf they are not, then change the permissions using chmod:
chmod 700 run.sh # sets read write and execute permissions for ownerYou can then run the file just like any executable file at the shell prompt:
./run.shNote how the loop variables are used inside the loop bodies:
$i # the current value of i
For the experimentation part of lab 8, you may want to write some bash scripts for running a large set of experiements. Often times echo is used inside these types of scripts to annotate output values so that you can easily match the time value with the particular experimental run. See run.sh for examples of echo.
For more information on bash shell programming see these links: bash shell programming
gdb has support for debugging threaded programs. Here are a few thread-specific commands:
set print thread-events # prints out thread start and exit events info threads # list all existing threads in program # the gdb threadno is the first value listed # the thread that hit the break point is *'ed thread threadno # switch to thread threadno's context # (see its stack when type where, for example) thread apply [threadno|all] command # apply the gdb command to all or a single threadHere is more information about debugging threaded programs in gdb:
% gdb ./racecond ... (gdb) set print thread-events on (gdb) run 5 Starting program: /home/newhall/public/cs31/week13/racecond 5 [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". [New Thread 0x7ffff77fd700 (LWP 17471)] hello I'm thread 0 with pthread_id 140737345738496 [New Thread 0x7ffff6ffc700 (LWP 17472)] hello I'm thread 1 with pthread_id 140737337345792 [New Thread 0x7ffff67fa700 (LWP 17473)] hello I'm thread 2 with pthread_id 140737328948992 [New Thread 0x7ffff5ff9700 (LWP 17474)] hello I'm thread 3 with pthread_id 140737320556288 [New Thread 0x7ffff57f8700 (LWP 17475)] hello I'm thread 4 with pthread_id 140737312163584 [Thread 0x7ffff6ffc700 (LWP 17472) exited] [Thread 0x7ffff77fd700 (LWP 17471) exited] [Thread 0x7ffff67fa700 (LWP 17473) exited] [Thread 0x7ffff57f8700 (LWP 17475) exited] count = 141335712 [Thread 0x7ffff5ff9700 (LWP 17474) exited] [Inferior 1 (process 17451) exited normally] (gdb) break worker_loop (gdb) run 3 (gdb) thread apply all break 76 Breakpoint 2, worker_loop (arg=0x602030) at racecond.c:76 76 count += i; (gdb) info threads Id Target Id Frame 4 Thread 0x7ffff67fa700 (LWP 17587) "racecond" worker_loop (arg=0x602038) at racecond.c:68 3 Thread 0x7ffff6ffc700 (LWP 17549) "racecond" __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:132 * 2 Thread 0x7ffff77fd700 (LWP 17548) "racecond" worker_loop (arg=0x602030) at racecond.c:76 1 Thread 0x7ffff7fcd700 (LWP 17539) "racecond" 0x00007ffff7bc6148 in pthread_join (threadid=140737345738496, thread_return=0x0) at pthread_join.c:89 # thread 2 is the current thread, where will show thread 2's stack trace: (gdb) where #0 worker_loop (arg=0x602030) at racecond.c:76 #1 0x00007ffff7bc4e9a in start_thread (arg=0x7ffff77fd700) at pthread_create.c:308 #2 0x00007ffff78f1dbd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112 #3 0x0000000000000000 in ?? () # switch to thread three's context (gdb) thread 3 [Switching to thread 3 (Thread 0x7ffff6ffc700 (LWP 17549))] #0 __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:132 132 ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: No such file or directory. # get thread 3's stack trace (gdb) where #0 __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:132 #1 0x00007ffff7bc7065 in _L_lock_858 () from /lib/x86_64-linux-gnu/libpthread.so.0 #2 0x00007ffff7bc6eba in __pthread_mutex_lock (mutex=0x6010c0) at pthread_mutex_lock.c:61 #3 0x0000000000400aa2 in worker_loop (arg=0x602034) at racecond.c:75 #4 0x00007ffff7bc4e9a in start_thread (arg=0x7ffff6ffc700) at pthread_create.c:308 #5 0x00007ffff78f1dbd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112 #6 0x0000000000000000 in ?? () # move into stack frame 3 of thread 3 (gdb) frame 3 #3 0x0000000000400aa2 in worker_loop (arg=0x602034) at racecond.c:75 75 pthread_mutex_lock(&my_mutex); (gdb) print my_mutex $1 = {__data = {__lock = 2, __count = 0, __owner = 17548, __nusers = 1, __kind = 0, __spins = 0, __list = {__prev = 0x0, __next = 0x0}}, __size = "\002\000\000\000\000\000\000\000\214D\000\000\001", '\000', __align = 2}