windows环境下QT库5.2.1版本,在QTCreator3.0.1中单步调试发现诡异有关问题
windows环境下QT库5.2.1版本,在QTCreator3.0.1中单步调试发现诡异问题。
以前一直没使用过QT,最近直接上了QT5,它sdk包中自带了QTCreator3.0.1编译器,我就直接用这编译器了,安装完成后,什么都不用设置,直接可以用。除了发现编译速度比vs慢,觉得其他还可以。
但是随着我建立的QT程序代码量逐渐增多,在某天调试时我发现了诡异的问题。。。我在主窗口构造函数中new了个按钮,单步调试到new的代码,调试窗上根本没显示new的按钮的相关数据。而且发现我构造函数有20行,单步调试只走了10行就直接跳出了。。。。严重觉得这单步调试的信息已经不对了,各位有人出现过同样的调试问题么?
我在这个工程中自定义了一个类,压根没有创建过此类的对象,但我把断点设置在此类的构造函数中,竟然一直走.......
我建了个timer定时器,timeout信号关联了某对象的某槽函数,槽函数也未被执行。(保证代码正确)
我重写了timerEvent事件处理函数,然后startTimer开启定时器也没戏。(保证代码正确)
但是!比如上面的定时器,我如果重新新建一个空工程,里面只写定时器的话,就实现了。这真的说明我开启定时器的代码确实是没问题的。
闹鬼了,现在这个工程根本无法继续调试下去了,调试信息根本对不上,有没有遇到过此类情况的?我不知是否是creator有什么要设置的地方?我同样的代码段拷贝到一个新的工程下,就能完成正常功能(比如定时器)。
------解决方案--------------------
仅供参考
------解决方案--------------------
调试都是用gdb, qtcreator上的调试有可能有bug, 可以结合printf写log调试。
以前一直没使用过QT,最近直接上了QT5,它sdk包中自带了QTCreator3.0.1编译器,我就直接用这编译器了,安装完成后,什么都不用设置,直接可以用。除了发现编译速度比vs慢,觉得其他还可以。
但是随着我建立的QT程序代码量逐渐增多,在某天调试时我发现了诡异的问题。。。我在主窗口构造函数中new了个按钮,单步调试到new的代码,调试窗上根本没显示new的按钮的相关数据。而且发现我构造函数有20行,单步调试只走了10行就直接跳出了。。。。严重觉得这单步调试的信息已经不对了,各位有人出现过同样的调试问题么?
我在这个工程中自定义了一个类,压根没有创建过此类的对象,但我把断点设置在此类的构造函数中,竟然一直走.......
我建了个timer定时器,timeout信号关联了某对象的某槽函数,槽函数也未被执行。(保证代码正确)
我重写了timerEvent事件处理函数,然后startTimer开启定时器也没戏。(保证代码正确)
但是!比如上面的定时器,我如果重新新建一个空工程,里面只写定时器的话,就实现了。这真的说明我开启定时器的代码确实是没问题的。
闹鬼了,现在这个工程根本无法继续调试下去了,调试信息根本对不上,有没有遇到过此类情况的?我不知是否是creator有什么要设置的地方?我同样的代码段拷贝到一个新的工程下,就能完成正常功能(比如定时器)。
------解决方案--------------------
仅供参考
#pragma comment(lib,"user32")
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#include <windows.h>
char datestr[16];
char timestr[16];
char mss[4];
void log(char *s) {
struct tm *now;
struct timeb tb;
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s %s",datestr,timestr,mss,s);
}
VOID CALLBACK myTimerProc1(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
) {
log("In myTimerProc1\n");
}
VOID CALLBACK myTimerProc2(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
) {
log("In myTimerProc2\n");
}
int main() {
int i;
MSG msg;
SetTimer(NULL,0,1000,myTimerProc1);
SetTimer(NULL,0,2000,myTimerProc2);
for (i=0;i<20;i++) {
Sleep(500);
log("In main\n");
if (GetMessage(&msg,NULL,0,0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
//2012-07-26 17:29:06.375 In main
//2012-07-26 17:29:06.875 In myTimerProc1
//2012-07-26 17:29:07.375 In main
//2012-07-26 17:29:07.875 In myTimerProc2
//2012-07-26 17:29:08.375 In main
//2012-07-26 17:29:08.375 In myTimerProc1
//2012-07-26 17:29:08.875 In main
//2012-07-26 17:29:08.875 In myTimerProc1
//2012-07-26 17:29:09.375 In main
//2012-07-26 17:29:09.890 In myTimerProc2
//2012-07-26 17:29:10.390 In main
//2012-07-26 17:29:10.390 In myTimerProc1
//2012-07-26 17:29:10.890 In main
//2012-07-26 17:29:10.890 In myTimerProc1
//2012-07-26 17:29:11.390 In main
//2012-07-26 17:29:11.890 In myTimerProc2
//2012-07-26 17:29:12.390 In main
//2012-07-26 17:29:12.390 In myTimerProc1
//2012-07-26 17:29:12.890 In main
//2012-07-26 17:29:12.890 In myTimerProc1
//2012-07-26 17:29:13.390 In main
//2012-07-26 17:29:13.890 In myTimerProc2
//2012-07-26 17:29:14.390 In main
//2012-07-26 17:29:14.390 In myTimerProc1
//2012-07-26 17:29:14.890 In main
//2012-07-26 17:29:14.890 In myTimerProc1
//2012-07-26 17:29:15.390 In main
//2012-07-26 17:29:15.890 In myTimerProc2
//2012-07-26 17:29:16.390 In main
//2012-07-26 17:29:16.390 In myTimerProc1
//2012-07-26 17:29:16.890 In main
//2012-07-26 17:29:16.890 In myTimerProc1
//2012-07-26 17:29:17.390 In main
//2012-07-26 17:29:17.890 In myTimerProc2
//2012-07-26 17:29:18.390 In main
//2012-07-26 17:29:18.390 In myTimerProc1
//2012-07-26 17:29:18.890 In main
//2012-07-26 17:29:18.890 In myTimerProc1
//2012-07-26 17:29:19.390 In main
//2012-07-26 17:29:19.890 In myTimerProc2
------解决方案--------------------
调试都是用gdb, qtcreator上的调试有可能有bug, 可以结合printf写log调试。