您有什么理论可以调试这种潜在有问题的内存访问模式吗?我有预感,这可能与我遇到的某个heisen-bug有关,但我似乎无法查明。
这是在valgrind下使用--track-origins=yes
,--leak-check=full
进行调试构建的片段
我如何滥用Qt的Gui lib,使其以下列方式表现出来?
==15169== Conditional jump or move depends on uninitialised value(s)
==15169== at 0x99CD8AA: XSetCommand (in /usr/lib64/libX11.so.6.3.0)
==15169== by 0x99D1FFE: XSetWMProperties (in /usr/lib64/libX11.so.6.3.0)
==15169== by 0x7280853: QWidgetPrivate::create_sys(unsigned long, bool, bool) (in /usr/lib64/qt4/libQtGui.so.4.8.3)
==15169== by 0x723550F: QWidget::create(unsigned long, bool, bool) (in /usr/lib64/qt4/libQtGui.so.4.8.3)
==15169== by 0x723F3E1: QWidget::setVisible(bool) (in /usr/lib64/qt4/libQtGui.so.4.8.3)
==15169== by 0x40DFE5: QWidget::show() (qwidget.h:494)
==15169== by 0x40DA5D: SYSApplication::on_start() (sysapplication.cpp:55)
==15169== by 0x40D5BC: main (main.cpp:8)
==15169== Uninitialised value was created by a stack allocation
==15169== at 0x723F0E0: QWidget::setVisible(bool) (in /usr/lib64/qt4/libQtGui.so.4.8.3)
==15169==
最佳答案
在main.cpp:8和sysapplication.cpp:55上检查您引用的变量。如果您有错误,那么这里使用的变量之一就是错误。
同样,检查未初始化的值是由QWidget :: setVisible上的堆栈分配创建的-您是否曾经调用过setVisible?如果是这样,该参数的值是多少?
重要说明:Valgrind将跟踪被复制的内存。如果你有:
int i; // 1
int j = i; // 2
int k = j; // 3
if (k) {} // 4
那么即使第1行是错误源,Valgrind也会在第4行引发此错误。
Qt也可能无法初始化某些内容。在Valgrind下运行时,许多库会引发很多令人担忧的错误。