将源代码附加到正在运行的进程,它是如何工作的?

时间:2014-05-08 05:54:22

标签: c++ compiler-construction computer-science

我有一个使用mysqlcppconn责任编译的二进制文件。我也得到了mysqlcppconn的源代码。

我使用visual studio打开mysqlcppconn源代码,导入.exe文件,将其设置为启动类,然后在源代码中放置一个断点。在调试模式下运行,当它到达断点时,我能够看到mysqlcppconn的变量值,它假定存储在.exe文件中。这是怎么发生的?

我的理解是: .exe文件是内存中的指令列表,所以如果我认为.exe文件作为输入输出活动,那么如果输入是A而我们期望输出B,编译器将使用  .exe内存(说明)指导A应该去的地方。但是当我使用源代码进行编译时,因为源代码产生了相同的指令,不知何故(这是我也不理解的地方),编译器决定使用源代码创建的指令而不是.exe文件来指导应该去。

有什么想法吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

Visual Studio必须在某处找到符号文件(* .pdb)。这些文件是在编译过程中生成的,包含将内存中的某些汇编代码与某些C ++源代码匹配所需的信息。那是因为二进制可执行文件包含关于它编译的源代码的无或非常少的信息。如果您有mysqlcppconn库以及源代码,很可能有人提供调试符号和源代码以简化开发。如果您自己编译了该库,Visual Studio会为您生成这些符号。

一旦调试器获得此信息,它就可以在程序运行时提取存储在RAM中的变量值。

答案 1 :(得分:0)

不,我不认为这是如何运作的。

如果附加到正在运行的程序,它只是告诉调试器哪个进程感兴趣,从中可以找到EXE文件和PDB符号文件。从PDB符号中,调试器可以找到所需的源代码文件和与二进制代码匹配的行号。

当您在源代码中放置断点时,调试器会检查符号表并找出二进制文件中对应的位置。然后它在该位置的正在运行的程序的二进制文件中放置一个断点。上次我查看了一个英特尔处理器,该处理器涉及用为此目的保留的不同单字节指令(RST 3)替换存储器中二进制指令。在其他处理器上,机制会有所不同。

当执行命中该特殊指令时,它会导致陷阱返回调试器。调试器恢复正确的指令(如果您碰巧看到反汇编)并在其表中查找断点,找到正确的源代码并显示它以供您查看。

它还可以找到正确的堆栈帧,并在该函数中显示任何局部变量。

如果一切正常,那就是一种魔力,但它的内涵却非常简单。

顺便说一句,它都可以在没有PDB文件或源代码文件的情况下工作,但是你只能使用调试器的反汇编来处理。