离奇的 debug 经历...之二

来源:互联网 发布:烛影斧声 知乎 编辑:程序博客网 时间:2024/05/16 08:44

离奇的Debug经历之二(DX2D平台下.)
代码编译没问题,但是,程序exe一启动就失败.
可能原因.代码确实是没有问题.但可能代码的输入参数出了问题,也就是,读取外部配置文件做了改动之类的.
描述,在一次动动代码的情况下,看了一会书,再去打开编译过的exe文件,断言错误.!说一个D3D的设备句柄为空.
Debug经历:跟据断言错误提示窗口,定位到断言的位置(具体定位到那一行),发现一个设备句柄为空.
在该行设断点.F5运行到该断点.
双击pDevice句柄,CTRL+ALT+Q查看变量的值为0!!,的确为空.
加入
    if(!pDevice)OutputDebugSring("pDevice is null");也输了出来.
看来设备句柄真的为空.

再来查看Call Stack栈.发现上一个函数Graphics类的函数.
进入该函数,单步调试,,可能是太粗心,没有发现什么可疑的.
请高手来调试,,只知道,,设备为空是因为创建设备失败了.但是怎么失败了,在哪里失败了,没有人知道.
因此,浪费了一下午时间.

晚上新员工培训,培训可没意思,于是自己开始认真的思考这个问题.
思路如下:
  pDevice为空.由于pDevice是通过Graphic->GetDevice()得到的.所以,GetDevice()返回的那个值也为空,也就是Graphics内部维护的变量m_pDevice也为空.那么m_pDevice是在什么时候被创建的呢?既然那个时候都创建失败了,为何不早早的就提示失败呢?
  带着这些疑问,开始查找m_pDevice相关信息.
  进入到Graphics.cpp文件,CTRL+F,查找"m_pDevice",发现了如下东东,
  hr = m_pDirect3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, m_hWnd,
   D3DCREATE_SOFTWARE_VERTEXPROCESSING, &m_PresentParameter, &m_pDevice);
 if(FAILED(hr))
 {
  // :出错后,该信息被存到txt里面,使得,发布为release后,也能方便的定位错误的位置!!!
  SYSLOG("******ERROR! Can't create Direct3D device.");
  return false;
 }
分析发现,上边语句也真的没有错误,但是程序的确是从这里出现了错误,单步执行了发出,前面没有错误...
这就纳了闷了,忽然想起来了,之前自己有改过游戏的脚本的配置,是不是脚本改出了问题,,,,敢赶紧查看,,结果如下,
ClientWidth = 800  // 800*600是整个游戏框架大小,虽然框加图片是1024*768的,但是
//游戏也自动调整画图大小.
ClientHeight = 600
最后事实证明,由于该脚本不支持单独一行的注释,我的第二行,用了单独一行的注释,所以为会错...........!!!