繁体   English   中英

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

[英]attach source code to a running process, how does it work?

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

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

我的理解是:.exe文件是内存中的指令列表,所以如果我认为.exe文件是输入-输出活动,那么如果输入是A并且我们期望输出B,则编译器将使用.exe内存(说明),以指导A应该去哪里。 但是当我使用源代码进行编译时,由于源代码在某种程度上产生了相同的指令(这也是我不理解的地方),编译器决定使用源代码创建的指令而不是.exe文件来指导一个应该去。

有任何想法吗?

提前致谢。

Visual Studio必须在某处(* .pdb)找到符号文件。 这些文件在编译过程中生成,并且包含将内存中的某些汇编代码与某些C ++源代码进行匹配所需的信息。 这是因为二进制可执行文件不包含任何信息,也几乎不包含有关其源代码的信息。 如果您获得了带有源代码的mysqlcppconn库,则很有可能有人提供了调试符号以及源代码以简化开发。 如果您自己编译该库,Visual Studio会为您生成这些符号。

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

不,我认为不是这样。

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

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

当执行触及该特殊指令时,它将导致陷阱返回调试器。 调试器将还原正确的指令(以防您碰巧看一下反汇编)并在其表中查找断点,找到正确的源代码并显示给您看。

它还会找到正确的堆栈框架,并向您显示该函数中的所有局部变量。

当一切都正常工作时,这有点神奇,但是在幕后却非常简单。

顺便说一句,所有这些都不需要PDB文件或源代码文件,但是您只有调试器的反汇编才能使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM