我必须使用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
冲突,因为它们删除了编译代码中的调试符号
感谢大家回答
答案 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