gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:50:43 25 4
gpt4 key购买 nike

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

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

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

有什么想法吗?

提前致谢。

最佳答案

不,我不认为它是这样工作的。

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

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

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

它还会找到正确的栈帧并向您显示该函数中的任何局部变量。

当一切正常时,它有点神奇,但在幕后它却出奇地简单。

顺便说一下,它也可以在没有 PDB 文件或源代码文件的情况下工作,但是你只需要调试器的反汇编就可以使用。

关于c++ - 将源代码附加到正在运行的进程,它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23533770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com