3
votes

Here goes what I did.

  • Download MESA and build with --enable-debug configuration.

  • The build results are all in ${MESA_SRC}/lib directory.

  • I set the LIBGL_DRIVERS_PATH and LD_LIBRARY_PATH to the ${MESA_SRC}/lib directory to use the built results rather than the original library in my local PC. I checked that OpenGL apps are using the libraries in ${MESA_SRC}/lib by using ldd as follows:

~/work/mesa$ ldd /usr/bin/glxgears  | grep libGL
    libGL.so.1 => lib/libGL.so.1 (0x00007f81aa9cc000)

where lib/libGL.so.1 is the build results from mesa source code.

Now, I wrote a very simple OpenGL app. Let say A. And run gdb and breakpoint to main.

work/mesa$  gdb A
GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
(gdb) b main
Breakpoint 1 at 0x4015af: file A.c, line 168.
(gdb) r
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main (argc=1, argv=0x7fffffffdee8) at compositor-pbo.c:168
168 {
(gdb) 

After that, I tried to load solib-search-path

(gdb) set solib-search-path /home/jyyoo/work/mesa/lib

where /home/jyyoo/work/mesa is the ${MESA_SRC}. But, I don't see any so files loading. As far as I know, if I issue solib-search-path, the loading of so files in the corresponding directory should be listed with. But, I don't see any. I know that there is a list of so files as follows:

$ ls /home/jyyoo/work/mesa/lib/*.so
/home/jyyoo/work/mesa/lib/i965_dri.so  
/home/jyyoo/work/mesa/lib/libglapi.so
/home/jyyoo/work/mesa/lib/libGL.so
/home/jyyoo/work/mesa/lib/libEGL.so
/home/jyyoo/work/mesa/lib/libGLESv1_CM.so
/home/jyyoo/work/mesa/lib/mesa_dri_drivers.so
/home/jyyoo/work/mesa/lib/libgbm.so
/home/jyyoo/work/mesa/lib/libGLESv2.so

So, if I try to 's' in gl functions, it does not step into...

Additionally, if I see the address of glBindBuffer, it shows

(gdb) p glBindBuffer
$1 = {<text variable, no debug info>} 0x7ffff7969f60 <glBindBufferARB>

But, the maps of this process does not load anything in that address:

/proc/<pid of gdb>$ cat maps

... snip ...

7fff5f652000-7fff5f673000 rw-p 00000000 00:00 0                          [stack]
7fff5f74d000-7fff5f74f000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
1

1 Answers

-1
votes

Seems the apis are written in assembly language, so no source can be displayed. Just set a breakpoint at glBindBuffer, then run, then the program will pause at the breakpoint, then type 'step' or 'next', you will step into the real function behind the api.