如何使用gdb进入openGL API?

时间:2015-01-20 10:51:25

标签: c linux debugging opengl gdb

这就是我所做的。

  • 下载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]

1 个答案:

答案 0 :(得分:-1)

似乎apis是用汇编语言编写的,因此不能显示任何来源。只需在glBindBuffer上设置一个断点,然后运行,然后程序将在断点处暂停,然后输入'step'或'next',你将进入api后面的实际函数。