这就是我所做的。
下载MESA并使用--enable-debug配置构建。
构建结果全部位于$ {MESA_SRC} / lib目录中。
我将LIBGL_DRIVERS_PATH和LD_LIBRARY_PATH设置为$ {MESA_SRC} / lib目录,以使用构建的结果而不是本地PC中的原始库。我检查了OpenGL应用程序使用ldd在$ {MESA_SRC} / lib中使用库,如下所示:
~/work/mesa$ ldd /usr/bin/glxgears | grep libGL libGL.so.1 => lib/libGL.so.1 (0x00007f81aa9cc000)
其中lib / libGL.so.1是mesa源代码的构建结果。
现在,我写了一个非常简单的OpenGL应用程序。让我们说A.然后运行gdb和断点到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)
之后,我尝试加载solib-search-path
(gdb) set solib-search-path /home/jyyoo/work/mesa/lib
其中/ home / jyyoo / work / mesa是$ {MESA_SRC}。但是,我没有看到任何这样的文件加载。据我所知,如果我发出solib-search-path,那么应该列出相应目录中的so文件加载。但是,我没有看到任何。我知道有这样的文件列表如下:
$ 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
所以,如果我试着去做&#39;在gl函数中,它没有进入......
另外,如果我看到glBindBuffer的地址,它会显示
(gdb) p glBindBuffer $1 = {<text variable, no debug info>} 0x7ffff7969f60 <glBindBufferARB>
但是,此过程的地图不会在该地址中加载任何内容:
/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]
答案 0 :(得分:-1)
似乎apis是用汇编语言编写的,因此不能显示任何来源。只需在glBindBuffer上设置一个断点,然后运行,然后程序将在断点处暂停,然后输入'step'或'next',你将进入api后面的实际函数。