现在调试阶段,出了问题,我晕了。折腾了我很久才定位到一个成员函数。这个成员函数真TMD奇怪,同一对象的其他成员函数内部的THIS指针都是一样的,偏偏这个鸟函数内部的THIS指针不一样!导致一连串的错误连锁反应。
我在整个工程里搜索这个函数名,就三个地方。一个是类的头文件里的申明。一个是构造函数里的初始化。再一个就是调用的地方了。但是从调用的地方F11跟进,THIS指针就跟其他的不一样了。。。
下面是这个函数的实现代码:
int CMyGameRun::GetZhuangTai (CString &str)
{
DWORD dwProID;
HANDLE hProcess = NULL;
HWND hWnd = ((CMyApp*)AfxGetApp())->g_hWnd ;
::GetWindowThreadProcessId (hWnd,&dwProID);
hProcess = ::OpenProcess (PROCESS_ALL_ACCESS,NULL,dwProID);
int buf = -1;
DWORD dwBaseAddr = 0;
dwBaseAddr = this->ViewDllAdrr (dwProID,"bcgame.dll");//我自己写的用来查找其他进程DLL地址的函数
dwBaseAddr = dwBaseAddr+ (DWORD)m_pBaseExcZhuangTai;
::ReadProcessMemory (hProcess,(LPVOID)dwBaseAddr ,&buf,1,NULL);
switch(buf)
{
case 0:
str = "等待";
return 0;
break;
case 1:
str = "进行";
return 1;
break;
default:
str = "未知";
return -1;
break;
}
::CloseHandle (hProcess);
return -1;
}
在此函数第一句下断后,发现各个成员变量都是0,似乎构造函数里的初始化工作没运行一样。
更加郁闷得是,而且单步没几句,我电脑就死机。。不知道是不是多线程引起的问题,想把多线程注释掉,慢慢排除,又牵一发动全身,跟进来就死机,重启电脑所有断点又不见了。。TMD我真想砸电脑了。神啊,救救我吧。
9 个解决方案
#1
应该是调用时候的代码有问题,this指针不对...
#2
多线程用单步调试是很难看的. 特别一个函数由几个线程调用. 单步的下一步, 是哪个线程正在运行, 必须分清楚.
假如你采用的是VS较高版本, 在调试环境下, 下面会有thread的页, 里面列举所有进程里面的线程, 想你跟踪具体的值变换, 必须要注意清楚是否都是在同一个激活线程内. 也可以双击直接跳到相应线程运行点上, 这样就可以更清楚知道问题.
假如你采用的是VS较高版本, 在调试环境下, 下面会有thread的页, 里面列举所有进程里面的线程, 想你跟踪具体的值变换, 必须要注意清楚是否都是在同一个激活线程内. 也可以双击直接跳到相应线程运行点上, 这样就可以更清楚知道问题.
#3
是不是某个地方越界了?
#4
调错也是编程功力的一部分。。
#5
在调用这个函数的地方设 数据断点,你懂的,
#6
this指针出问题了,如果是VC6,那么就是栈被破坏了。
具体问题还是要自己调试才能分析出来的,这里有问题不代表源头是这里。
具体问题还是要自己调试才能分析出来的,这里有问题不代表源头是这里。
#7
越界了!!
#8
把这个函数int CMyGameRun::GetZhuangTai (CString &str)里面的代码全部清空看看还会不会出问题。有时候定位到函数未必就是函数本身的问题。如果这样还出问题,那继续向上清理代码。不是真的清除代码,可以在函数体的第一行直接return。
估计是访问冲突。。。多线程。。。唉,不做访问锁的程序员伤不起啊。。。
估计是访问冲突。。。多线程。。。唉,不做访问锁的程序员伤不起啊。。。
#9
小睡了一觉,顿觉精神气爽。我用的是VC6.0,没办法,只好在各个线程关键点用MessageBox调试。。。终于找到关键所在,解决拉!~谢谢各位!8楼说的好啊,以后一定注意访问锁得问题。结贴散分.
#1
应该是调用时候的代码有问题,this指针不对...
#2
多线程用单步调试是很难看的. 特别一个函数由几个线程调用. 单步的下一步, 是哪个线程正在运行, 必须分清楚.
假如你采用的是VS较高版本, 在调试环境下, 下面会有thread的页, 里面列举所有进程里面的线程, 想你跟踪具体的值变换, 必须要注意清楚是否都是在同一个激活线程内. 也可以双击直接跳到相应线程运行点上, 这样就可以更清楚知道问题.
假如你采用的是VS较高版本, 在调试环境下, 下面会有thread的页, 里面列举所有进程里面的线程, 想你跟踪具体的值变换, 必须要注意清楚是否都是在同一个激活线程内. 也可以双击直接跳到相应线程运行点上, 这样就可以更清楚知道问题.
#3
是不是某个地方越界了?
#4
调错也是编程功力的一部分。。
#5
在调用这个函数的地方设 数据断点,你懂的,
#6
this指针出问题了,如果是VC6,那么就是栈被破坏了。
具体问题还是要自己调试才能分析出来的,这里有问题不代表源头是这里。
具体问题还是要自己调试才能分析出来的,这里有问题不代表源头是这里。
#7
越界了!!
#8
把这个函数int CMyGameRun::GetZhuangTai (CString &str)里面的代码全部清空看看还会不会出问题。有时候定位到函数未必就是函数本身的问题。如果这样还出问题,那继续向上清理代码。不是真的清除代码,可以在函数体的第一行直接return。
估计是访问冲突。。。多线程。。。唉,不做访问锁的程序员伤不起啊。。。
估计是访问冲突。。。多线程。。。唉,不做访问锁的程序员伤不起啊。。。
#9
小睡了一觉,顿觉精神气爽。我用的是VC6.0,没办法,只好在各个线程关键点用MessageBox调试。。。终于找到关键所在,解决拉!~谢谢各位!8楼说的好啊,以后一定注意访问锁得问题。结贴散分.