[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [open-cobol-list] Preliminary results on gdb support
From: |
Jeff Chimene |
Subject: |
Re: [open-cobol-list] Preliminary results on gdb support |
Date: |
Tue, 09 Jun 2009 17:23:28 -0700 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.18) Gecko/20081105 Thunderbird/2.0.0.18 Mnenhy/0.7.5.0 |
On 06/09/2009 05:10 PM, Jeff Chimene wrote:
Hi,
I have some preliminary results on adding debugging support to OC.
I'd like to get some feedback from the list as to whether it's worth
pursuing.
This work is based on OC v 1.0. If it's worth continuing, it can't be
too difficult to port to 1.1
Consider the following COBOL program:
PROGRAM-ID. prog.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 G VALUE "012345678".
02 X PIC X OCCURS 4.
02 Z PIC X OCCURS 1 TO 4.
01 H PIC 99.
88 myriad value 1, 3, 9 thru 16, 17, 25 thru 50.
PROCEDURE DIVISION.
DISPLAY X((3 + 1) / 2) NO ADVANCING.
DISPLAY X(2 ** 2) NO ADVANCING.
DISPLAY Z(1).
STOP RUN.
Here is a sample run using a simple gdb user-defined command "view"
(See below)
$ gdb hello
Breakpoint 1 at 0x8048b5f: file /home/jchimene/hello.cob, line 11.
<=== This breakpoint is set in a project-specific .gdbinit: "break
hello.cob:11"
(gdb) run
Breakpoint 1, prog_ (entry=0) at /home/jchimene/hello.cob:11
11 DISPLAY X((3 + 1) / 2) NO ADVANCING.
Change the following "X" to "G"
(gdb) view "X" <=== Notice the quotation marks
$1 = (unsigned char *) 0x8049360 "01234567"
(gdb) view "H"
$2 = (unsigned char *) 0x8049350 "00"
(gdb) quit
The simple way to view COBOL data items is based on the following:
Modify cobc to take the information from the CB_FIELD structure and
convert it to the following structure:
static struct symtab {
char const *cobname;
unsigned char *cname;
}
This structure is defined and initialized in the program's .h file
(e.g. hello.c.h)
static struct symtab {
char const *cobname;
unsigned char *cname;
} st[] = { { "X", b_5 }, {"H", b_8}, {'\0'} }
Change the "X" above to "G"
The scope of the variables defined in the .h file is the
compiler-generated routine "prog_()". This is rather mysterious;
there's no good way to /a priori/ set COBOL-specific breakpoints [*].
For now, it looks like an inspection of the C source combined with a
project-specific .gdbinit is the solution.
----------
[*]
i.e. a BREAK MAIN produces no useful work as this is the runtime
entry point; which is not the same as the start of the procedure
division. There doesn't seem to be a good way to always identify the
start of the procedure division. I'm probably missing something
obvious.
The next modification involves a gdb initialization file that searches
the structure on COBNAME then prints the corresponding CNAME. This
user-defined command is defined in a project-independent
$HOME/.gdbinit (or wherever it is for Windows users)
define view
set $r0 = 0
set $r1 = st[$r0].cobname
while ($r1 > 0)
if (0 == strcmp($r1,$arg0))
print st[$r0].cname
end
set $r0 = $r0 + 1
set $r1 = st[$r0].cobname
end
The big issue right now is to extend the SYMTAB structure
initialization to handle the various ways that cobc implements (record
definition vs. working storage vs. constants) and declares COBOL data
items (integer, float, &c). The controlling logic is fairly complex,
and I don't know if duplicating it for the purposes of creating the
SYMTAB structure will be a useful task.
Another, big(ger) issue is to add support for child fields.