This is the mail archive of the gdb-prs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug gdb/18629] New: global variable


https://sourceware.org/bugzilla/show_bug.cgi?id=18629

            Bug ID: 18629
           Summary: global variable
           Product: gdb
           Version: 7.9
            Status: NEW
          Severity: normal
          Priority: P2
         Component: gdb
          Assignee: unassigned at sourceware dot org
          Reporter: rbd at hawaii dot edu
  Target Milestone: ---

Hi all,

I am having problems with gdb being unable to recognize the type of primitive
global variables within an executable compiled from multiple source files under
MacOS Yosemite 10.10.4 and Xcode 6.4 (6E35b). The same problem occurs whether I
compile with either /usr/bin/cc or /usr/bin/gcc, both of which appear to be
using Apple LLVM version 6.1.0 (clang-602.0.53) based on LLVM 3.6.0svn. (I have
not tried with a self-built gcc compiled from gcc source.) I first noticed this
a few days ago after a MacPorts update which installed gdb 7.9.1, but the same
problem occurred when I deactivated MacPorts gdb 7.9.1 and reverted to MacPorts
gdb 7.7.1. I also tried building gdb 7.7.1 from source, and also get the same
problem. (Also note that MacPorts 7.9.1 gdb has a startup problem which may be
related to this issue, see the end of this message.)

You can reproduce this bug by creating the following two files m0.c and m1.c:

% cat m0.c
#include <stdio.h>
float gf;
extern void func();
int main() {
        gf= 1.23;
        printf("gf: %4.2f\n", gf);
        func();
}

% cat m1.c
#include <stdio.h>
extern float gf;
void func() {
        float lf;
        lf= 4.56;
        printf("lf: %4.2f\n", lf);
}

Then compile as follows:

% cc -g -c m0.c -o m0.o
% cc -g -c m1.c -o m1.o
% cc -g -o m m0.o m1.o

When you debug with gdb, the type of the global float gf is unknown to gdb from
within main():

% /usr/local/bin/gdb m
GNU gdb (GDB) 7.7.1
...
Reading symbols from m...done.
(gdb) break main
Breakpoint 1 at 0x100000eee: file m0.c, line 5.
(gdb) break func
Breakpoint 2 at 0x100000f27: file m1.c, line 5.
(gdb) run
Starting program: /private/tmp/m
Breakpoint 1, main () at m0.c:5
5               gf= 1.23;
(gdb) s
6               printf("gf: %4.2f\n", gf);
(gdb) s
gf: 1.23
7               func();
(gdb) ptype gf
type = <data variable, no debug info>
(gdb) print gf
$1 = 1067282596

However, the type of local float lf within func() is known:

(gdb) continue
Continuing.
Breakpoint 2, func () at m1.c:5
5               lf= 4.56;
(gdb) s
6               printf("lf: %4.2f\n", lf);
(gdb) s
lf: 4.56
7       }
(gdb) ptype lf
type = float
(gdb) print lf
$2 = 4.55999994

The type of the global float gf is also unknown to gdb from within func():

(gdb) ptype gf
type = <data variable, no debug info>
(gdb) print gf
$3 = 1067282596

If instead of using two source files m[01].c you combine them into the single
file s.c with the contents

#include <stdio.h>
float gf;
int main() {
        void func();
        gf= 1.23;
        printf("gf: %4.2f\n", gf);
        func();
}

void func() {
        float lf;
        lf= 4.56;
        printf("lf: %4.2f\n", lf);
}

and compile with

% cc -o s -g s.c

then gdb works perfectly well, recognizing the type of gf and correctly
printing its floating point value within either main() or func().

Naturally, the actual program I am having a problem with is much larger and
really needs to be in multiple files, but I think this example shows the
problem about as succinctly as possible. The problem is not limited to float
variables -- a global int variable shows the same issue of unknown type.

I have noticed that when I compile the above single-file s.c code, a directory
s.dSYM is created. This is supposedly done when a dsymutil symbol utility is
implictly run by cc. I have read that dsymutil is *not* run when the source
files are separately compiled into .o files and the latter are then linked with
a separate command (as in my multi-file cc command sequence shown above).
Perhaps this has some bearing on the problem?

With regard to MacPorts gdb 7.9.1, I am also seeing the following startup
problem (as noted at the end of the first paragraph of this message) when the
executable is actually run in gdb. Note the references to the various missing
files "/BinaryCache/coreTLS/...". There is no /BinaryCache directory on my
system.

% gdb m
GNU gdb (GDB) 7.9.1
...
(gdb) break main
Breakpoint 1 at 0x100000eee: file m0.c, line 5.
(gdb) run
Starting program: /private/tmp/m
warning:
`/BinaryCache/coreTLS/coreTLS-35.30.2~2/Objects/coretls.build/coretls.build/Objects-normal/x86_64/system_coretls_vers.o':
can't open to read symbols: No such file or directory.
warning: Could not open OSO archive file
"/BinaryCache/coreTLS/coreTLS-35.30.2~2/Symbols/BuiltProducts/libcoretls_ciphersuites.a"
warning: Could not open OSO archive file
"/BinaryCache/coreTLS/coreTLS-35.30.2~2/Symbols/BuiltProducts/libcoretls_handshake.a"
warning: Could not open OSO archive file
"/BinaryCache/coreTLS/coreTLS-35.30.2~2/Symbols/BuiltProducts/libcoretls_record.a"
warning: Could not open OSO archive file
"/BinaryCache/coreTLS/coreTLS-35.30.2~2/Symbols/BuiltProducts/libcoretls_stream_parser.a"

Thanks,

Roger Davis
Univ. of Hawaii

-- 
You are receiving this mail because:
You are on the CC list for the bug.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]