- 论坛徽章:
- 0
|
本帖最后由 dugubai 于 2010-07-31 21:17 编辑
请问在内核的kgdb调试过程中,i r esp ebp命令显示的是不是堆栈指针的真实值?
为什么其值与通过如下汇编语句传出来的值不同?二者有何区别跟联系?二者跟p $sp, p $fp显示的堆栈值又有什么关系?- __asm__ __volatile__
- ("movl %%esp, %0\n\t"
- "movl %%ebp, %1\n\t"
- : "=m" (espt),
- "=m" (ebpt)
- : : "memory");
复制代码 另外问下printk会不会影响到堆栈?
为什么我在执行printk后,堆栈的内容被改变了?
代码:- 188 __asm__ __volatile__
- 189 ("movl %%esp, %0\n\t"
- 190 "movl %%ebp, %1\n\t"
- 191 : "=m" (espt),
- 192 "=m" (ebpt)
- 193 : : "memory");
- 194
- 195 printk("-->XXX: printk problem %d \n", 1111);
- 196
- 197 __asm__ __volatile__
- 198 ("movl %%esp, %0\n\t"
- 199 "movl %%ebp, %1\n\t"
- 200 : "=m" (espt),
- 201 "=m" (ebpt)
- 202 : : "memory");
复制代码 执行前的堆栈内容:
(gdb) p espt
$1 = (void *) 0xf7061fa8
(gdb) x /16xw espt
0xf7061fa8: 0xc0564c28 0x00000002 0xc056624e 0x00000002
0xf7061fb8: 0x00000011 0xf7061fcc 0xf7061fcc 0xf7061fa8
0xf7061fc8: 0xc0670280 0xf7061fe0 0xc060e4fd 0xc053a7fb
0xf7061fd8: 0x0000007b 0xc060e480 0x00000000 0xc0104ed7
执行后的堆栈内容:
(gdb) p espt
$2 = (void *) 0xf7061fa8
(gdb) x /16xw espt
0xf7061fa8: 0xc056622f 0x00000457 0xc056624e 0x00000002
0xf7061fb8: 0x00000011 0xf7061fcc 0xf7061fcc 0xf7061fa8
0xf7061fc8: 0xc0670280 0xf7061fe0 0xc060e4fd 0xc053a7fb
0xf7061fd8: 0x0000007b 0xc060e480 0x00000000 0xc0104ed7 |
|