我经常发现在调试程序时使用堆栈是很有用的,并且我会遇到任何正确对齐的,指针大小的值的符号.我已经厌倦了手动执行此操作,因此我尝试编写一个命令来为我完成此操作.问题是"信息符号"似乎不喜欢在通过指针取消引用设置其参数时使用便利变量作为其参数.IE:
(gdb) info symbol 0xb6ca4d28
[Useful Symbol Information]
(gdb) set $pointer = $esp
(gdb) while ( *(int*)$pointer != 0xb6ca4d28)
>set $pointer += 4
>end
(gdb) x/x $pointer
0x6ebee064: 0xb6ca4d28
(gdb) set $dereferencePointer = *(int *)$pointer
(gdb) p/x $dereferencePointer
$103 = 0xb6ca4d28
(gdb) info symbol $dereferencePointer
No symbol matches $dereferencePointer.
(gdb) set $dereferencePointer = 0xb6ca4d28
(gdb) p/x $dereferencePointer
$104 = 0xb6ca4d28
(gdb) info symbol $dereferencePointer
[Useful symbol information]
(gdb)
Run Code Online (Sandbox Code Playgroud)
为什么是这样?这是一个错误吗?有没有不同的方法来做到这一点?
谢谢!
吕克
PS:使用vanilla GDB 7.5
从列表更新:
这很可能是一个错误.
从另一个控制台应用程序启动控制台应用程序时,控制台所有权如何工作?
我看到四种可能性:
我很可能错过了一些东西,这四个选项都没有充分描述Windows对其控制台的作用.
如果答案接近选项4.我的后续问题是两个过程中的哪一个负责管理窗口?(在需要刷新/重绘屏幕时处理图形更新等)
一个具体的例子:运行CMD.然后,使用CMD运行[console application].[控制台应用程序]将写入与CMD正在使用的控制台窗口相同的内容.
何时表达式包含在标记为内联的函数内,被认为是"潜在评估"?
a.cpp
template <typename T>
const T& foo(const T& arg) { return arg; }
inline void dead() {
int x(21);
x = foo(x);
}
Run Code Online (Sandbox Code Playgroud)
b.cpp
#include <iostream>
template <typename T> const T& foo(const T&);
int main(int argc, char *argv[]) {
std::cout << foo(12) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果在定义内联函数时将表达式视为"可能已评估",则应该实例化模板,并且我希望$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin成功链接.相反,如果这样的函数本身变得使用了,那么在内联声明的函数中的表达式只会变为"可能被评估",那么我希望$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin在链接步骤中失败.
到目前为止,我已经测试了xl C++ 12(成功链接)和各种版本的gcc + clang 3.5(所有这些都无法链接).
哪种行为是正确的?我在这里错过了第三种选择吗?
c++ one-definition-rule inline-functions language-lawyer c++11