Professional Documents
Culture Documents
CSE 1105
Overview
GNU Debugger
Omega Server
Unix-based Server Provides C, C++, Lisp, Prolog, Cobol, and Fortran Language Compilers Pine Mail Server Users connect via telnet, ssh, hummingbird or other remote log ins
Connect
2. SSH Secure Shell
installed on all school computers
Connect
3. Hummingbird
Writing programs
rm : delete a file
<usage>%rm file_name
cp : copy files
<usage>%cp source_file destination_file
lpr
Use GDB to debug programs in C, C++, Modular-2, and Pascal, Fortran GDB is part of the GNU Project that was launched in 1984 to develop a complete UNIX style operating system. Free software: the GNU system is free ( pronounced guh-noo) at www.gnu.org GDB is protected by the GNU General Public License (GPL)
Start your program, specifying anything that might affect its behavior. Make your program stop on specified conditions. Examine what has happened, when your program has stopped. Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.
Starting GDB
gcc filename with option g <usage> gcc filename g gdb in shell prompt with executable file <usage> gdb a.out gdb prompt executing by gdb command (gdb) commands
GDB Commands
list(l) show the source list each 10line list [[file:]n|func] help show the information of gdb command help [name] break setup the breakpoint break [[file:]n|function]
clear remove the breakpoint clear [[file:]n|function] run begin program run [arglist] print expr show the value of expr
print expr
ret (or return) exit the current function as return retrunvalue ret retval finish execute the current function until the function returns the retval kill quit the current debugging process quit quit the gdb
Example bugsome.c
The program is to calculate factorial and power Not working for power function Setup the breakpoint as power function Program bugsome.c has been compiled with gcc to file a.out
/home/dsk22/ xxx1234 /1320> gcc bugsome.c
List bugsome.c
#include <stdio.h> #include <stdlib.h> /* returns n * (n-1) * ... * 1 */ int factorial(int n) { if(n == 1) return 1; } return n * factorial(n - 1);
void f3() { printf("This is f3().\n"); } void f2() { f3(); printf("11^7 = %d\n", power(11, 7)); } void f1() { printf("11! = %d\n", factorial(11)); f2(); } int main() { f1(); printf("0! = %d\n", factorial(0)); } return 0;
Result a.out
/home/dsk22/ xxx1234 /1320> a.out 11! = 39916800 This is f3(). Stack overflow: pid 315, proc a.out, addr 0x11fdfffe0, pc 0x1200012bc /home: warning, disk quota exceeded for user id 18531 Segmentation fault (core dumped) /home/dsk22/xxx1234/1320>
Debugging example
/home/dsk22/ xxx1234 /1320> gcc bugsome.c -g /home/dsk22/ xxx1234 /1320> gdb a.out GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.16 (alpha-dec-osf4.0), Copyright 1996 Free Software Foundation, Inc... (gdb) break power Breakpoint 1 at 0x1200012d8: file bugsome.c, line 16.
Example continued
(gdb) run Starting program: /home/dsk22/xxx1234/1320/a.out 11! = 39916800 This is f3(). Breakpoint 1, power (b=11, e=7) at bugsome.c:16 16 return b * power(b, e-1); (gdb) c Continuing. Breakpoint 1, power (b=11, e=6) at bugsome.c:16 16 return b * power(b, e-1);
(gdb) ret 1 Make power return now? (y or n) y #0 0x1200012f8 in power (b=11, e=1) at bugsome.c:16 return b * power(b, e-1); (gdb) l 11 } 12 13 /* returns b^e , e>=0 */ 14 int power(int b, int e) 15 { 16 return b * power(b, e-1); 17 } 18 19 void f3() 20 {
(gdb) l 21 printf("This is f3().\n"); 22 } 23 24 void f2() 25 { 26 f3(); 27 printf("11^7 = %d\n", power(11, 7)); 28 } 29 30 void f1() (gdb) break 28 Breakpoint 2 at 0x1200013c4: file bugsome.c, line 28. (gdb) c Continuing. 11^7 = 19487171 Breakpoint 2, f2 () at bugsome.c:28 28 }
(gdb) n f1 () at bugsome.c:34 34 } (gdb) n main () at bugsome.c:41 41 printf("0! = %d\n", factorial(0)); (gdb) s factorial (n=0) at bugsome.c:7 7 if(n == 1) (gdb) l 2 #include <stdlib.h> 3 4 /* returns n * (n-1) * ... * 1 */ 5 int factorial(int n) 6 { 7 if(n == 1) 8 return 1; 9 10 return n * factorial(n - 1); 11 }
(gdb) ret 1 Make factorial return now? (y or n) y #0 0x120001478 in main () at bugsome.c:41 41 printf("0! = %d\n", factorial(0)); (gdb) c Continuing. 0! = 1 Program exited normally. (gdb) quit