アプリケーションで使用されている構造に関する情報を取得するために、/DEBUG (Pascal および/または C) でコンパイルされた実行中のアプリケーションでデバッグ情報にアクセスできるかどうか疑問に思っていました。
3 に答える
アプリケーションは、 SS$_DEBUGを使用して、いつでもデバッガに何かを要求できます。GO で終わるコマンドのリストを送信すると、アプリケーションはデバッガーが処理を行った後も実行を続けます。私はそれを使って、わざわざコードを書くことなく、きれいにフォーマットされた一連の構造をダンプしました。
ANALYZE/IMAGEを使用すると、アプリケーションを実行せずにイメージ ファイル内のデバッガ データを調べることができます。
Too long for a comment ...
As far as I know, structure information about elements is not in the global symbol table. What I did, on Linux, but that should work on VMS/ELF files as well:
$ cat tests.c
struct {
int ii;
short ss;
float ff;
char cc;
double dd;
char bb:1;
void *pp;
} theStruct;
...
$ cc -g -c tests.c
$ ../extruct/extruct
-e-insarg, supply an ELF object file.
Usage: ../extruct/extruct [OPTION]... elf-file variable
Display offset and size of members of the named struct/union variable
extracted from the dwarf info in the elf file.
Options are:
-b bit offsets and bit sizes for all members
-lLEVEL display level for nested structures
-n only the member names
-t print base types
$ ../extruct/extruct -t ./tests.o theStruct
size of theStruct: 0x20
offset size type name
0x0000 0x0004 int ii
0x0004 0x0002 short int ss
0x0008 0x0004 float ff
0x000c 0x0001 char cc
0x0010 0x0008 double dd
0x0018 0x0001 char bb:1
0x001c 0x0004 pp
$
適切なデバッガー情報が表示されない場合がありますが、ANALYZE/SYSTEM .. SET PROCESS ... EXAMINE ... を使用して、実行中のプログラムのデータをいつでも調べることができます。プログラムが読み取ったに違いないことがわかっているレコードのような日付。FORMAT/TYPE=block-type もチェックしてください。ただし、データを利用するには、構造を .STB ファイルにコンパイルする必要があります。
SDA を使用している場合、別のセッションで対話的にプログラムを自分で実行して、サンプルのサンプル アドレスを取得することをお勧めします。リンク マップよりも簡単です。あなたのプログラムが RMS を大量に使用している場合 (私の場合は常に :-)、SDA> SHOW PROC/RMS=(FAB,RAB) はレコードおよびキー バッファーの便利なアドレスを提供する可能性がありますが、それらも RTL によって管理されている可能性があるため、そうではありません。あなたにとって意味のあるものになります。