【问题标题】:using windows debugger to view a memory location written to in C?使用 Windows 调试器查看用 C 写入的内存位置?
【发布时间】:2016-01-02 22:30:00
【问题描述】:

我在 dosbox 中运行 Turbo C 和 windows 调试

我有这个 C 程序,它有两条主线,如您所见。 int a=5 然后一行显示a的地址,printf("address of a=%x",&a)

我运行它

好像告诉我a已经分配了fff4的地址

现在我想使用调试来希望在那个内存地址看到 5 的值

但是没有显示

如何在调试中看到它?

【问题讨论】:

  • 一旦你的程序退出,任何对内存的临时更改都会有效地消失。您需要在程序运行时进行调试 - 在程序中设置断点,然后在断点处暂停时检查内存。
  • 那是虚拟地址。每个过程都不​​同。
  • @PaulR , rohan, 那么是否可以编写一个以非临时方式写入 RAM 的 C 程序?
  • @barlop:在某些嵌入式环境中,您可能可以,但通常不会 - RAM 是临时的,而在大多数现代操作系统中,它无论如何都是虚拟内存空间,因此一旦您的进程消失,那么地址和内存内容没有意义。
  • 您能否详细介绍一下您为什么要这样做?你的目标是什么 ?在一个真正的 dos 16 位环境中——你的目标是 turbo c——你可以在你的进程之外写入内存,并让这个更改在你的程序退出后继续存在。

标签: c windows debugging assembly turbo-c


【解决方案1】:

这是我的 DEBUG 编译后的main 函数的输出:

16E1:01FA 55            PUSH    BP                                 
16E1:01FB 8BEC          MOV BP,SP                              
16E1:01FD 83EC02        SUB SP,+02                             
16E1:0200 C746FE0500    MOV WORD PTR [BP-02],0005              
16E1:0205 8D46FE        LEA AX,[BP-02]                         
16E1:0208 50            PUSH    AX                                 
16E1:0209 B89401        MOV AX,0194                            
16E1:020C 50            PUSH    AX                                 
16E1:020D E8AA06        CALL    08BA                               
16E1:0210 59            POP CX                                 
16E1:0211 59            POP CX                                 
16E1:0212 8BE5          MOV SP,BP                              
16E1:0214 5D            POP BP                                 
16E1:0215 C3            RET

int a=5; 是函数main 中的一个本地 变量,它存储在堆栈中(MOV WORD PTR [BP-02],0005)。当您离开函数 (RET) 时,堆栈上的值会丢失。在正在运行的程序之外你看不到它。

如果你这样做,你的计划可以顺利进行

  1. 初始化一个全局变量并
  2. 制作一个小型 .com 程序。

simplepr.c:

#include <stdio.h>

int a=5;

void main()
{
    printf ("address of a=%x",&a);
}

编译:

TCC.EXE -mt -lt simplepr.c

调试会话:

n simplepr.com
l
g         -> address of a=125c (example)
d 125c    -> or what the address is

【讨论】:

  • 谢谢,这看起来很吸引人,我想试试看。我在 virtualbox 的 VM 中有 DOS 6.22,我有调试和我的 EXE。你是如何获得EXE(您在答案开头显示的)?
  • @barlop。在调试命令'u'。我使用 Turbo Debugger 来获取“_main”的地址。
  • 我无法到达那里i.stack.imgur.com/Q0jDA.png 我无法让它输出内存位置,如果您可以包含 turbo 调试器命令来获取 _main 的地址,那就更好了。跨度>
  • @barlop: 'd 1562' 就像“dump”! “g”是“去”和“?”是“帮助” ;-) Turbo Debugger 的解释有点复杂。您是否安装了 Turbo Debugger 以及哪个版本?
  • 我明白了,当 int a=5 时,5 在那里 i.imgur.com/X0bdtxh.pngi.imgur.com/PL66kGc.png 谢谢
猜你喜欢
  • 2012-04-18
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 2010-11-04
  • 2010-11-11
  • 2014-03-16
相关资源
最近更新 更多