Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将源代码附加到正在运行的进程,它是如何工作的?_C++_Compiler Construction_Computer Science - Fatal编程技术网

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

C++ 将源代码附加到正在运行的进程,它是如何工作的?,c++,compiler-construction,computer-science,C++,Compiler Construction,Computer Science,我有一个二进制文件,它是使用mysqlcppconn编译的。我还得到了mysqlcppconn的源代码 我使用visual studio打开了mysqlcppconn源代码,导入.exe文件,将其设置为启动类,然后在源代码中添加断点。在调试模式下运行,当它到达断点时,我能够看到mysqlcppconn的变量值,该变量值假定存储在.exe文件中。这是怎么发生的 我的理解是: .exe文件是内存中的指令列表,因此如果我认为.exe文件是一个输入输出活动,那么如果输入是a,而我们希望输出是B,编译器将

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

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

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

有什么想法吗


提前感谢。

Visual Studio一定在某个地方找到了符号文件(*.pdb)。这些文件是在编译过程中生成的,并且包含将内存中的某些汇编代码与某些C++源代码匹配的信息。这是因为二进制可执行文件不包含或很少包含有关编译源代码的信息。如果您在源代码中附带了
mysqlcppconn
库,则很可能有人在源代码中提供了调试符号以简化开发。如果您自己编译该库,VisualStudio将为您生成这些符号


一旦调试器获得了这些信息,它可能会在程序运行时提取存储在RAM中的变量值。

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

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

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

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

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

当一切正常运行时,这是一种魔力,但在封面下,它却出人意料地简单

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