At 14:44 12/10/01 , vous avez écrit:
Number: 222 Category: gdb Synopsis: GDB scope does not work quite right for Pascal Confidential: no Severity: non-critical Priority: medium Responsible: unassigned State: open Class: sw-bug Submitter-Id: net Arrival-Date: Fri Oct 12 05:48:01 PDT 2001 Closed-Date: Last-Modified: Originator: Adam Oldham Release: gdb 20010813 Organization: Environment:
Mandrake 8.1, Kernel 2.4.8, glibc 2.2, Intel Platform
Description:
Source is compiled with FPC (Free Pascal Compiler). This can happen with any source of pascal. When you declare nested functions, gdb's scope does not allow the viewing of the variables that are from the parent function that should be within the scope.
How-To-Repeat:
The simple program attached will produce the problem. When compiled and run, the correct output is displayed, but if you run GDB on it, and break on function test2 and print out int1 which is a global variable for the function test1, you receive: "No symbol "INT1" in current context."
There are several remarks to that bug report: 1) I don't know at all how nested functions work in C Are they allowed? Do they also use a paremt fram pushing method ? If yes, can locals from the calling function be found in C? Maybe someone from the gdb mailing list can answer that question. If this is already implemented for C its probably easier to just take the same method.
2) There is a solution, I implemented it in the IDE for Free Pascal but it is rather complicated. Let me try to explain this solution to everyone. Nested functions in pascal get a hidden parameter that contains the frame pointer (ebp value for i386 cpu) of the calling function. This allows the program to access correctly local variable of the function that called the nested function. This value is searched in the backtrace at the location where the frame pointer are usually saved ( i.e. at offset 0 of the local ebp value for i386) If we find the corresponding frame (which is not always the first frame above the current one) then we can try if we find the unfound local symbol in that frame).
To ease this search, I inserted a pseudo-parameter to the function called parent_ebp (in lower case, while normal Free Pascal symbols are uppercased) that indicate the location of this parnt frame pointer.
3) As maintainer of the pascal language specific part of GDB, I am of course willing to introduce this into the gdb sources, but I would really like to get first some feedback from the gpc list. Does gpc do anything about this calling frame hidden parameter ? Could we agree to use the same method for both compiler in order to get better support for Pascal ?
Pierre Muller Institut Charles Sadron 6,rue Boussingault F 67083 STRASBOURG CEDEX (France) mailto:muller@ics.u-strasbg.fr Phone : (33)-3-88-41-40-07 Fax : (33)-3-88-41-40-99
Pierre Muller wrote:
At 14:44 12/10/01 , vous avez écrit:
Number: 222 Category: gdb Synopsis: GDB scope does not work quite right for Pascal Confidential: no Severity: non-critical Priority: medium Responsible: unassigned State: open Class: sw-bug Submitter-Id: net Arrival-Date: Fri Oct 12 05:48:01 PDT 2001 Closed-Date: Last-Modified: Originator: Adam Oldham Release: gdb 20010813 Organization: Environment:
Mandrake 8.1, Kernel 2.4.8, glibc 2.2, Intel Platform
Description:
Source is compiled with FPC (Free Pascal Compiler). This can happen with any source of pascal.
and any pascal compiler: it happens also for gpc
When you declare nested functions, gdb's
scope does not allow the viewing of the variables that are from the parent function that should be within the scope.
How-To-Repeat:
The simple program attached will produce the problem. When compiled and run, the correct output is displayed, but if you run GDB on it, and break on function test2 and print out int1 which is a global variable for the function test1, you receive: "No symbol "INT1" in current context."
There are several remarks to that bug report:
- I don't know at all how nested functions work in C
Are they allowed?
AKAIK no, they are not allowed, and this is the root of the problem, since gdb is written mainly by/for C programmers.
Do they also use a paremt fram pushing method ? If yes, can locals from the calling function be found in C? Maybe someone from the gdb mailing list can answer that question. If this is already implemented for C its probably easier to just take the same method.
- There is a solution, I implemented it in the IDE for Free Pascal
but it is rather complicated. Let me try to explain this solution to everyone. Nested functions in pascal get a hidden parameter that contains the frame pointer (ebp value for i386 cpu) of the calling function. This allows the program to access correctly local variable of the function that called the nested function. This value is searched in the backtrace at the location where the frame pointer are usually saved ( i.e. at offset 0 of the local ebp value for i386) If we find the corresponding frame (which is not always the first frame above the current one) then we can try if we find the unfound local symbol in that frame).
To ease this search, I inserted a pseudo-parameter to the function called parent_ebp (in lower case, while normal Free Pascal symbols are uppercased) that indicate the location of this parnt frame pointer.
- As maintainer of the pascal language specific part of GDB,
I am of course willing to introduce this into the gdb sources, but I would really like to get first some feedback from the gpc list. Does gpc do anything about this calling frame hidden parameter ? Could we agree to use the same method for both compiler in order to get better support for Pascal ?
Do'nt know, only Peter or Franck probably can tell.
On Fri, Oct 12, 2001 at 06:57:32PM +0200, Maurice Lombardi wrote:
There are several remarks to that bug report:
- I don't know at all how nested functions work in C
Are they allowed?
AKAIK no, they are not allowed, and this is the root of the problem, since gdb is written mainly by/for C programmers.
They aren't allowed by standard C. GCC does in fact allow them, although their use isn't recommended. I think GDB's support for them is somewhat crusty.
On Fri, Oct 12, 2001 at 06:57:32PM +0200, Maurice Lombardi wrote:
There are several remarks to that bug report:
- I don't know at all how nested functions work in C
Are they allowed?
AKAIK no, they are not allowed, and this is the root of the problem, since gdb is written mainly by/for C programmers.
They aren't allowed by standard C. GCC does in fact allow them, although their use isn't recommended. I think GDB's support for them is somewhat crusty.
The thread http://sources.redhat.com/ml/gdb-patches/2001-07/msg00714.html is probably relevant.
Following on Joel's strategy (Ada) the first thing needed is probably a testcase so that people know the status of the underlying code
Andrew