我想知道是否可以在使用 /DEBUG(Pascal 和/或 C)编译的正在运行的应用程序中访问调试信息,以便检索有关应用程序中使用的结构的信息。
3 回答
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
$
应用程序始终可以使用SS$_DEBUG要求调试器执行某些操作。如果您发送以 GO 结尾的命令列表,则应用程序将在调试器完成其操作后继续运行。我用它来转储一堆格式整齐的结构,而无需费心编写代码。
ANALYZE/IMAGE可用于在不运行应用程序的情况下检查映像文件中的调试器数据。
尽管您可能看不到很好的调试器信息,但您始终可以使用 ANALYZE/SYSTEM .. SET PROCESS ... EXAMINE ... 查看正在运行的程序的数据。 SDA SEARCH 命令可能会派上用场,以“查找”可识别的小块日期,就像您知道程序必须读取的记录一样。另请查看 FORMAT/TYPE=block-type,但要使用数据,您必须将结构编译为 .STB 文件。
使用 SDA 时,您可能想尝试在其他会话中以交互方式自己运行程序,以获取示例地址以进行工作......比链接地图更容易!如果您的程序使用 RMS 一堆(我的总是这样做:-),那么 SDA> SHOW PROC/RMS=(FAB,RAB) 可能会为记录和密钥缓冲区提供方便的地址,尽管这些也可能由 RTL 管理,因此不是对你有意义。