Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 07 Nov 2019 05:56:05 +0000
From:      bugzilla-noreply@freebsd.org
To:        bugs@FreeBSD.org
Subject:   [Bug 241773] lldb does not display external variables properly.
Message-ID:  <bug-241773-227@https.bugs.freebsd.org/bugzilla/>

next in thread | raw e-mail | index | archive | help
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D241773

            Bug ID: 241773
           Summary: lldb does not display external variables properly.
           Product: Base System
           Version: 12.0-RELEASE
          Hardware: Any
                OS: Any
            Status: New
          Severity: Affects Only Me
          Priority: ---
         Component: bin
          Assignee: bugs@FreeBSD.org
          Reporter: bc979@lafn.org

Here is an issue that has plagued me for some time:

Using FreeBSD 12.0:


testlib.c:
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>

char id[4];
int sock;

void testfunc() {
 struct stat sb;
 stat("testlib.c", &sb);
 strcpy (id, "aa");
 sock =3D 5;
 printf("Size of testlib.c is %i bytes.\n", (int)sb.st_size);
}


testprog.c:
#include <stdio.h>

extern char id[4];
extern int sock;

void testfunc(void);
int main(int argc, char **argv) {
 testfunc();
 printf ("id =3D %s\n", id);
 printf ("sock =3D %d\n", sock);
 return 0;
}


Makefile:
all:    clean testprog run

testprog:
       cc -Wall -g -c -fPIC -o testlib.o testlib.c
       cc  -shared -Wl,-export-dynamic -o testlib.so testlib.o
       cc -Wall -g -o testprog ./testlib.so testprog.c

clean:
       rm -f testlib.o testlib.so testprog

run:
       ./testprog


Using make:
rm -f testlib.o testlib.so testprog
cc -Wall -g -c -fPIC -o testlib.o testlib.c
cc  -shared -Wl,-export-dynamic -o testlib.so testlib.o
cc -Wall -g -o testprog ./testlib.so testprog.c
./testprog
Size of testlib.c is 268 bytes.
id =3D aa
sock =3D 5


Running lldb:
master# lldb testprog
(lldb) target create "testprog"
Current executable set to 'testprog' (x86_64).
(lldb) b main
Breakpoint 1: where =3D testprog`main + 22 at testprog.c:8, address =3D
0x0000000000201366
(lldb) r
Process 34787 launching
Process 34787 launched: '/home/doug/zzz/testprog' (x86_64)
Process 34787 stopped
* thread #1, name =3D 'testprog', stop reason =3D breakpoint 1.1
   frame #0: 0x0000000000201366 testprog`main(argc=3D1, argv=3D0x00007fffff=
ffeb38)
at testprog.c:8
  5=20=20=20=20=20
  6     void testfunc(void);
  7     int main(int argc, char **argv) {
-> 8      testfunc();
  9       printf ("id =3D %s\n", id);
  10      printf ("sock =3D %d\n", sock);
  11      return 0;
(lldb) n
Size of testlib.c is 268 bytes.
Process 34787 stopped
* thread #1, name =3D 'testprog', stop reason =3D step over
   frame #0: 0x000000000020137f testprog`main(argc=3D1, argv=3D0x00007fffff=
ffeb38)
at testprog.c:9
  6     void testfunc(void);
  7     int main(int argc, char **argv) {
  8       testfunc();
-> 9      printf ("id =3D %s\n", id);
  10      printf ("sock =3D %d\n", sock);
  11      return 0;
  12    }
(lldb) p id
error: use of undeclared identifier 'id'
(lldb) p sock
error: Couldn't materialize: couldn't get the value of variable sock:
testlib.so[0x4004] can't be resolved, testlib.so is not currently loaded
error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression
(lldb) c
id =3D aa
sock =3D 5
Process 34787 resuming


You notice that lldb cannot display values for id or sock.  It even gives q=
uite
different messages about them.  However the program can access the values a=
nd
it prints them out properly.  Why can't lldb see them?  How can that be
corrected?

What is even more interesting is that in the real application there are qui=
te a
few of these global variables and lldb can display some of them, just not a=
ll.=20
Possibly it has to do with the specific names as DATE generally works.  sock
and id never seem to work.

Now using FreeBSD 12.1:

We now have 12.1 with an updated compiler and linker.  Things have changed.=
  I
added a bit to testprog.c:

master# more testprog.c
#include <stdio.h>

extern char id[4];
extern int sock;
int unknown;

void testfunc(void);
int main(int argc, char **argv) {
 testfunc();
 unknown =3D 9;
 printf ("id (%x) =3D %s\n", (int)&id, id);
 printf ("sock(%x)  =3D %d\n", (int)&sock, sock);
 printf ("unknown (%x) =3D %d\n", (int)&unknown, unknown);
 return 0;
}


running it yields:
master# ./testprog
Size of testlib.c is 268 bytes.
id (20400c) =3D aa
sock(204010)  =3D 5
unknown (204008) =3D 9

That appears to be correct.  Everything worked.  However, with lldb, instea=
d of
error messages I get wrong values:

master# lldb testprog
(lldb) target create "testprog"
Current executable set to 'testprog' (x86_64).
(lldb) b main
Breakpoint 1: where =3D testprog`main + 22 at testprog.c:9:3, address =3D
0x00000000002012f6
(lldb) r
Process 6039 launching
Process 6039 launched: '/home/doug/zzz/testprog' (x86_64)
Process 6039 stopped
* thread #1, name =3D 'testprog', stop reason =3D breakpoint 1.1
   frame #0: 0x00000000002012f6 testprog`main(argc=3D1, argv=3D0x00007fffff=
ffeb38)
at testprog.c:9:3
  6=20=20=20=20=20
  7     void testfunc(void);
  8     int main(int argc, char **argv) {
-> 9      testfunc();
  10      unknown =3D 9;
  11      printf ("id (%x) =3D %s\n", (int)&id, id);
  12      printf ("sock(%x)  =3D %d\n", (int)&sock, sock);
(lldb) n
Size of testlib.c is 268 bytes.
Process 6039 stopped
* thread #1, name =3D 'testprog', stop reason =3D step over
   frame #0: 0x0000000000201307 testprog`main(argc=3D1, argv=3D0x00007fffff=
ffeb38)
at testprog.c:10:11
  7     void testfunc(void);
  8     int main(int argc, char **argv) {
  9       testfunc();
-> 10     unknown =3D 9;
  11      printf ("id (%x) =3D %s\n", (int)&id, id);
  12      printf ("sock(%x)  =3D %d\n", (int)&sock, sock);
  13      printf ("unknown (%x) =3D %d\n", (int)&unknown, unknown);
(lldb)=20
Process 6039 stopped
* thread #1, name =3D 'testprog', stop reason =3D step over
   frame #0: 0x0000000000201312 testprog`main(argc=3D1, argv=3D0x00007fffff=
ffeb38)
at testprog.c:11:3
  8     int main(int argc, char **argv) {
  9       testfunc();
  10      unknown =3D 9;
-> 11     printf ("id (%x) =3D %s\n", (int)&id, id);
  12      printf ("sock(%x)  =3D %d\n", (int)&sock, sock);
  13      printf ("unknown (%x) =3D %d\n", (int)&unknown, unknown);
  14      return 0;
(lldb) p id
(char [4]) $0 =3D ""
(lldb) p &id
(char (*)[4]) $1 =3D 0x000000080024d000
(lldb) p unknown
(int) $2 =3D 9
(lldb) p &unknown
(int *) $3 =3D 0x0000000000204008
(lldb)=20

For the variable unknown lldb displays the correct address and value.  For =
id
and sock, it displays the wrong address and the value at the wrong address.=
=20
The correct values are in the proper addresses:

x 0x204008
0x00204008: 09 00 00 00 61 61 00 00 05 00 00 00 00 00 00 00  ....aa........=
..

--=20
You are receiving this mail because:
You are the assignee for the bug.=



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-241773-227>