当我使用GDB调试OpenGL程序时,GDB存在误导行为。
我从glMapBufferARB获取一个地址,GDB中的地址显示
$35 = (GLubyte *) 0xb74bb000 <Address 0xb74bb000 out of bounds>
我无法打印其内容。
但是,我可以在我的程序中访问其内容。
glMapBufferARB返回的地址是否与普通内存地址不同? 为什么GDB无法访问它?
答案 0 :(得分:2)
从glMapBufferARB返回的地址是否与普通的内存地址不同?
是的,它可能是映射到您的进程地址空间的GPU上的DMA缓冲区或内存。因此,内存不在您的流程分配之外。
答案 1 :(得分:1)
从glMapBufferARB返回的地址是否与普通的内存地址不同?
可能很特别 - OpenGL用户空间库和内核驱动程序可能合谋安排一个只有他们理解的特殊映射。
为什么GDB无法访问它?
GDB使用ptrace(2)
来读取低级(被调试的)进程内存。实际与您的图形卡对话的内核设备驱动程序很可能不支持ptrace
,并且GDB尝试读取该内存失败。这可能是设备驱动程序中的错误,但如果您使用的是闭源驱动程序(Nvidia?),则可能无法对其进行任何操作。