【发布时间】:2015-01-16 04:33:39
【问题描述】:
我有一个 C++ 程序,我正在尝试使用 GDB 进行调试。我正在通过优化构建它,我经常遇到我想调试类似的情况:
int newVar = someArray[thing1 + thing2];
但是,GCC 很聪明,并且会大量优化代码。也许那时只存储中间的thing1 + thing2,而单独的thing1 和thing2 已被覆盖。当我让 GDB 打印 thing1 时,我得到了 <value optimized out>。 thing2 也一样。
所以我有两个问题:
如果我向 gdb 询问
p thing1 + thing2,它是否足够聪明地意识到该中间体当前存储在寄存器中?或者它只是试图天真地评估表达式,意识到它使用的两个变量都被优化了,然后失败了?如何获得在执行的任何给定点实际可用的表达式评估中间体的列表?如果它将
&someArray + sizeof(int) * thing2存储为中间,我想知道这一点。 GCC 是否没有包含有关其对 GDB 的优化的足够详细信息,以弄清楚实际存储了哪些中间体/编译器如何决定使用每个寄存器?是否有一些我可以指示 GCC 生成的超级详细的多兆字节调试信息格式?是否有其他编译器/调试器对可以更好地处理这个问题?
如果我要花 20 分钟来跟踪函数的程序集,注意 thing1 和 thing2 的来源以及从它们派生的任何内容何时与 someArray 的地址相遇,我将能够手动解决这个问题。但我希望调试器为我做这件事,因为编译器必须首先跟踪所有这些东西才能进行优化。
【问题讨论】:
标签: c++ debugging gcc optimization gdb