设置g ++编译器标志进行调试

时间:2019-09-28 09:20:54

标签: c++

假设我有以下c ++代码

int main()
{
    const int n = 10;
    int *pa = new int[n];
    for (int i=0; i!=n; ++i) pa[i] = 0;
    cout << pa[n] << endl;
    delete[] pa;
}

实际上,这段代码可以由g ++编译并运行,但是由于pa[n]不在数组范围内,因此结果错误。

我的问题是:是否可以在编译阶段为g ++设置一些调试器标志,以便编译器可以提示我这一点?此外,在g ++中进行调试的正常标志设置是什么?

1 个答案:

答案 0 :(得分:0)

使用-fsanitize=address进行编译有时会有所帮助;参见AddressSanitizer

此外,使用-g进行编译并在valgrind下运行程序会发现许多动态内存错误(quick intro)。

通常,您要启用基本的编译器警告。 -Wall -Wextra -pedantic -O2是一个好的开始。 -O2从技术上讲是为了优化,但有时您会收到更多/更好的警告。

-g标志将调试信息包含在已编译的代码中。如果使用调试器,则可以查看局部变量的名称/值,行号等。这可能与重新排序或直接删除一些代码的优化冲突。建议使用-g -Og进行调试(而不是-O2)。