システム・プログラムI
電子・情報工学系
新城 靖
<yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/syspro1-1998/1998-04-21
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/
http://www.hlla.is.tsukuba.ac.jp/~yas/index-j.html
----------------------------------------------------------------------
1: /*
2: vaddr-print.c -- 変数の番地をしらべるプログラム
3: ~yas/syspro1/cc/vaddr-print.c
4: $Header: vaddr-print.c,v 1.1 97/05/19 23:19:10 yas Exp $
5: Start: 1997/05/19 22:58:49
6: */
7: #include <stdlib.h>
8:
9: int x1=1 ;
10: int x2 ;
11:
12: extern int etext, edata, end ;
13:
14: main( argc,argv,envp )
15: int argc ;
16: char *argv[] ;
17: char *envp[] ;
18: {
19: int x3 ;
20: char *x4p ;
21:
22: printf("&main == 0x%x \n",&main );
23: printf("&etext == 0x%x \n",&etext );
24: printf("&edata == 0x%x \n",&edata );
25: printf("&end == 0x%x \n",&end );
26:
27: printf("&x1 == 0x%x (data)\n",&x1 );
28: printf("&x2 == 0x%x (bss)\n",&x2 );
29: printf("&x3 == 0x%x (auto)\n",&x3 );
30: x4p = malloc( 10 );
31: printf("x4p == 0x%x (heap)\n",x4p );
32: x4p = malloc( 10 );
33: printf("x4p == 0x%x (heap)\n",x4p );
34: recursive( 3 );
35: }
36:
37: recursive( n )
38: int n ;
39: {
40: int x5 ;
41: printf("&x5 == 0x%x (auto,%d)\n",&x5,n );
42: if( n<=0 )
43: return;
44: recursive( n-1 );
45: }
----------------------------------------------------------------------
実行例。
---------------------------------------------------------------------- % cp ~yas/syspro1/cc/vaddr-print.c .% make vaddr-print
cc vaddr-print.c -o vaddr-print % ./vaddr-print
&main == 0x400ad0 &etext == 0x400cb0 &edata == 0x10002000 &end == 0x10002000 &x1 == 0x100010d0 (data) &x2 == 0x10001130 (bss) &x3 == 0x7fff2f1c (auto) x4p == 0x10002010 (heap) x4p == 0x10002028 (heap) &x5 == 0x7fff2ef4 (auto,3) &x5 == 0x7fff2ecc (auto,2) &x5 == 0x7fff2ea4 (auto,1) &x5 == 0x7fff2e7c (auto,0) % size vaddr-print
text data bss dec hex filename 2933 304 28 3265 cc1 vaddr-print %
----------------------------------------------------------------------
% cc -g ファイル名.c -o 実行形式% dbx 実行形式
![]()
----------------------------------------------------------------------
% cc -g vaddr-print.c -o vaddr-print
% dbx vaddr-print
dbx version 7.2 Aug 29 1997 03:27:55
Executable /home/lab2/OS/yas/syspro1-1998/cc/vaddr-print
(dbx) list
>* 18 {
19 int x3 ;
20 char *x4p ;
21
22 printf("&main == 0x%x \n",&main );
23 printf("&etext == 0x%x \n",&etext );
24 printf("&edata == 0x%x \n",&edata );
25 printf("&end == 0x%x \n",&end );
26
27 printf("&x1 == 0x%x (data)\n",&x1 );
(dbx) stop at 27
Process 0: [3] stop at "/home/lab2/OS/yas/syspro1-1998/cc/vaddr-print.c":27
(dbx) run
Process 26330 (vaddr-print) started
&main == 0x400ad0
&etext == 0x400cd0
&edata == 0x10002000
&end == 0x10002000
[3] Process 26330 (vaddr-print) stopped at [main:27 ,0x400b54]
27 printf("&x1 == 0x%x (data)\n",&x1 );
(dbx) print x1
1
(dbx) where
> 0 main(argc = 1, argv = 0x7fff2f44, envp = 0x7fff2f4c) ["/home/lab2/OS/yas/sy
spro1-1998/cc/vaddr-print.c":27, 0x400b54]
1 __istart() ["crt1tinit.s":13, 0x400a90]
(dbx) cont
&x1 == 0x100010d0 (data)
&x2 == 0x10001130 (bss)
&x3 == 0x7fff2f1c (auto)
x4p == 0x10002010 (heap)
x4p == 0x10002028 (heap)
&x5 == 0x7fff2ef4 (auto,3)
&x5 == 0x7fff2ecc (auto,2)
&x5 == 0x7fff2ea4 (auto,1)
&x5 == 0x7fff2e7c (auto,0)
Process 26330 (vaddr-print) terminated
(dbx) quit
%
----------------------------------------------------------------------
良く使うコマンド。
残念ながら、SGI では今の所動かない。 Mule の中から dbx を呼ぶ。ソース・プログラム上でどこを実行しているかを 追うことができる。 使い方。% xdbx 実行形式 &%
![]()
dbx 実行形式 リターン」と打つ。
注意:今の所、残念ながら、gcc でコンパイルしたものをgdb ではデバッグで きません。% cc -g ファイル名.c -o 実行形式% gdb 実行形式
![]()
良く使うコマンド。
xgdb ではなく、xxgdb。x が2回。 Mule の中から gdb を呼ぶ。ソース・プログラム上でどこを実行しているかを 追うことができる。 使い方。% xxgdb 実行形式 &%
![]()
gdb 実行形式 リターン」と打つ。
----------------------------------------------------------------------
1: /*
2: segv.c -- segmentation violation を起こすプログラム
3: ~yas/syspro1/cc/segv.c
4: $Header$
5: Start: 1998/04/20 23:56:19
6: */
7: #include <stdlib.h>
8:
9: main()
10: {
11: char *p ;
12: strcpy(p,"hello");
13: printf("%s\n",p);
14: }
----------------------------------------------------------------------
実行例。
----------------------------------------------------------------------
% make segv
cc segv.c -o segv
% ./segv
Segmentation fault (core dumped)
% echo $LANG
ja_JP.EUC
% file core
core: IRIX コア・ダンプ of 'segv'
% ls -l core
-rw-r--r-- 1 yas lab 512 4月 20日 23時58分 core
% cc -g segv.c -o segv
% dbx segv
dbx version 7.2 Aug 29 1997 03:27:55
core is an incomplete corefile
Executable /home/lab2/OS/yas/syspro1-1998/cc/segv
(dbx) run
Process 26541 (segv) started
Process 26541 (segv) stopped on signal SIGSEGV: Segmentation violation (default)
at [strcpy:123 ,0xfa6a1c0]
Source (of strcpy.s) not available for Process 26541
(dbx) where
> 0 strcpy(0xfb68d04, 0x10001000, 0x7fff2f4c, 0x7fff2f4c) ["strcpy.s":123, 0xfa
6a1c0]
1 main() ["/home/lab2/OS/yas/syspro1-1998/cc/segv.c":12, 0x4009c4]
2 __istart() ["crt1tinit.s":13, 0x400960]
(dbx) list
Source (of strcpy.s) not available for Process 26541
(dbx) up
main: 12 strcpy(p,"hello");
(dbx) list
13 printf("%s\n",p);
14 }
(dbx)
----------------------------------------------------------------------
----------------------------------------------------------------------
1: /*
2: arg-print.c -- mainの引数を表示するプログラム
3: ~yas/syspro1/cc/arg-print.c
4: $Header: arg-print.c,v 1.2 97/04/21 18:29:06 yas Exp $
5: Start: 1997/04/21 18:23:13
6: */
7:
8: main( argc,argv )
9: int argc ;
10: char *argv[] ;
11: {
12: int i ;
13: printf("argc is %d\n", argc );
14: for( i=0 ; i<argc ; i++ )
15: printf("argv[%d]: %s\n",i,argv[i] );
16: }
----------------------------------------------------------------------
実行例。
---------------------------------------------------------------------- % cp ~yas/syspro1/cc/arg-print.c .% make arg-print
cc arg-print.c -o arg-print % ./arg-print
argc is 1 argv[0]: ./arg-print % ./arg-print who am i
argc is 4 argv[0]: ./arg-print argv[1]: who argv[2]: am argv[3]: i %
----------------------------------------------------------------------