2

我想知道是否可以在使用 /DEBUG(Pascal 和/或 C)编译的正在运行的应用程序中访问调试信息,以便检索有关应用程序中使用的结构的信息。

4

3 回答 3

1

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
$
于 2014-02-14T13:44:30.247 回答
1

应用程序始终可以使用SS$_DEBUG要求调试器执行某些操作。如果您发送以 GO 结尾的命令列表,则应用程序将在调试器完成其操作后继续运行。我用它来转储一堆格式整齐的结构,而无需费心编写代码。

ANALYZE/IMAGE可用于在不运行应用程序的情况下检查映像文件中的调试器数据。

于 2014-01-24T15:13:13.057 回答
1

尽管您可能看不到很好的调试器信息,但您始终可以使用 ANALYZE/SYSTEM .. SET PROCESS ... EXAMINE ... 查看正在运行的程序的数据。 SDA SEARCH 命令可能会派上用场,以“查找”可识别的小块日期,就像您知道程序必须读取的记录一样。另请查看 FORMAT/TYPE=block-type,但要使用数据,您必须将结构编译为 .STB 文件。

使用 SDA 时,您可能想尝试在其他会话中以交互方式自己运行程序,以获取示例地址以进行工作......比链接地图更容易!如果您的程序使用 RMS 一堆(我的总是这样做:-),那么 SDA> SHOW PROC/RMS=(FAB,RAB) 可能会为记录和密钥缓冲区提供方便的地址,尽管这些也可能由 RTL 管理,因此不是对你有意义。

于 2014-01-25T22:51:21.507 回答