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>