在gdb

2011-04-28 41 views
1

评估变量/功能我有以下代码,在gdb

... 
char* seg = mmap(0, ...) 
printf("seg=%x\n", seg); 
... 

该程序打印与seg=b7ffd000。而在gdb(执行相同)时,使用p/x seg时,它会打印$2 = 0x0。我很困惑。是不是一样var seg?为什么值不同。

PS:在mmap中,第一个参数是映射内存的优先地址,返回值是映射内存的实际地址。

+3

您是否在编译时启用了优化? – 2011-04-28 19:29:43

+0

是的,当-O3被移除时,问题就消失了。对原因感兴趣。像哪个值是内存的真实地址,启用了优化... – Richard 2011-04-28 21:00:31

回答

3

既然你已经在评论中回答了我的问题,我可以回答!

作为printf的结果而看到的值是实际地址。在调试器中,您看到0的值为seg,因为启用优化时,编译器可以自由地执行各种奇怪的事情(这通常会使分步调试变得棘手)。虽然(假设你不依赖任何未定义的行为),但“可观察”的行为应该总是正确的。