Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GDB-识别分段故障发生的位置_C++_Debugging_Gdb_Segmentation Fault - Fatal编程技术网

C++ GDB-识别分段故障发生的位置

C++ GDB-识别分段故障发生的位置,c++,debugging,gdb,segmentation-fault,C++,Debugging,Gdb,Segmentation Fault,我的程序中出现了一个分段错误,我用GDB来调试它。以下是我在GDB中的回溯: #0 __memcpy_ssse3_back () at ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:199 #1 0x00007f054885b6ef in ViSpectrumAnalyzer::run (this=0x991e98) at vispectrumanalyzer.cpp:66 #2 0x00007f05488573e8 in ViProces

我的程序中出现了一个分段错误,我用GDB来调试它。以下是我在GDB中的回溯:

#0  __memcpy_ssse3_back () at ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:199
#1  0x00007f054885b6ef in ViSpectrumAnalyzer::run (this=0x991e98) at vispectrumanalyzer.cpp:66
#2  0x00007f05488573e8 in ViProcessorList::manipulateInput (this=0x991b00, data=0xdf2c30) at viprocessorlist.cpp:64
#3  0x00007f0548852a3b in ViMultiExecutor::runNotify (this=0x991ab0) at vimultiexecutor.cpp:34
#4  0x00007f0548855f9d in ViExecutor::connect (this=0xc104ca031a0, processor=0x1059f0) at viexecutor.cpp:227
#5  0x00007f054c416cd8 in QThreadPrivate::start(void*) () from libQtCore.so.5
#6  0x00007f054a35ae9a in start_thread (arg=0x7f0530e4a700) at pthread_create.c:308
#7  0x00007f054bbb34bd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#8  0x0000000000000000 in ?? ()
如果我测试我的程序,回溯#1总是在ViSpectrumAnalyzer的运行功能中。但是,它始终位于不同的位置(+-5行)。我现在的问题是:上面的回溯实际上是否表明SegFault发生在VisSpectrumAnalyzer::run()中。回溯#0提到memcpy,我稍后使用了几行(但不是第66行)。在上面的示例中,第66行是一条语句:

int size = windowSize - bufferSize;

WindowsSize和bufferSize都是整数。所以我不认为断层真的会发生在那里。我必须补充一点,我非常确定我的一些类会导致问题,因为它们不是线程安全的(例如:没有互斥)

首先,确保源代码和二进制文件是同步的。我已经删除了evrything并从头开始构建。启用优化后,编译器可以自由地洗牌代码片段。如果segfault可以用-O0复制,堆栈跟踪将更加准确。谢谢你的提示。到底什么是-O0?GCC提供了不同级别的面向对象优化。级别0完全是零。首先阅读完整的细节,确保源代码和二进制文件是同步的。我已经删除了evrything并从头开始构建。启用优化后,编译器可以随意洗牌代码片段。如果segfault可以用-O0复制,堆栈跟踪将更加准确。谢谢你的提示。到底什么是-O0?GCC提供了不同级别的面向对象优化。级别0完全是零。详情请参阅