Code :: blocks,SIGSEGV,Segmentation fault。在? ()

时间:2016-07-02 18:52:16

标签: c++ debugging codeblocks

我必须使用Code :: Blocks在我的C ++程序中调试段错误。 不幸的是,堆栈跟踪没有正确显示,而是我看到?? ()

这是一个最小的例子:

#include <iostream>

using namespace std;

int main()
{
    int *plop;
    cout << *plop << endl;
    return 0;
}

调试器说:

  

编程接收信号SIGSEGV,分段故障。在??? ()()

但我期待更有用的东西,比如“在主要()”

编辑:这是构建日志,如果它有帮助

-------------- Build: Debug in tests (compiler: GNU GCC Compiler)---------------

g++.exe -Wall -fexceptions -g -O -pedantic -Wextra -std=c++0x -std=c++14  -c D:\C\tests\main.cpp -o obj\Debug\main.o
D:\C\tests\main.cpp: In function 'int main()':
D:\C\tests\main.cpp:8:14: warning: 'plop' is used uninitialized in this function [-Wuninitialized]
     cout << *plop << endl;
              ^
g++.exe  -o bin\tests.exe obj\Debug\main.o  -s  
Output file is bin\tests.exe with size 542.00 KB

第二次编辑:终于解决了:)

对于那些通过google来到这里的人:在我的案例中检查了条带符号-s和优化器-O编译器选项,这些选项与-g冲突,因为它们删除了编译代码中的调试符号

感谢大家回答

2 个答案:

答案 0 :(得分:0)

您正在取消引用未初始化的指针。这种未定义的行为和你的程序毫无意义。

编译器可以自由地生成任何它想要的东西(包括导致段错误的代码或者根本不做任何事情) - 基本上,所有的赌注都是关闭的,你可以信任 nothing ,你可以&#39;甚至指望你的调试器显示任何理智,因为它只需要处理编译器生成的内容 - 可能是无论。 不要使用未初始化的变量/调用UB。

答案 1 :(得分:0)

你必须像贝娄那样初始化int *plop;指针,然后打印值:

#include <iostream>

using namespace std;

int main()
{
    int *plop = new int(15);
    // *plop = 120; // you can change the plop value as custom
    cout << *plop << endl;
    return 0;
}

结果将是:15