C 使用gdb进入GNU函数

C 使用gdb进入GNU函数,c,gdb,C,Gdb,我想了解C的memcpy函数的内部工作原理。有没有一种方法可以让我使用gdb进入函数?当然。到达memcpy调用时,使用si(步骤说明)进入程序集 不过,只有在手头有libc调试版本和glibc源代码的情况下,才能获得源代码 如果您只想查看实现,请查看,例如。没有人说编译器不能在线扩展函数,或者用其他东西替换(例如,GCC将printf(“某个常量字符串”);替换为put(“某个常量字符串”);)@vonbrand:True,但这只发生在memcpy的极少数情况下(实际上仅当在可证明对齐的边界上

我想了解C的memcpy函数的内部工作原理。有没有一种方法可以让我使用gdb进入函数?

当然。到达
memcpy
调用时,使用
si
(步骤说明)进入程序集

不过,只有在手头有libc调试版本和glibc源代码的情况下,才能获得源代码


如果您只想查看实现,请查看,例如。

没有人说编译器不能在线扩展函数,或者用其他东西替换(例如,GCC将
printf(“某个常量字符串”);
替换为
put(“某个常量字符串”);
)@vonbrand:True,但这只发生在
memcpy
的极少数情况下(实际上仅当在可证明对齐的边界上复制大小恒定的小块数据时)。GCC更常见的做法是插入对
memcpy
的调用,例如在执行结构赋值时。(挑剔:如果常量字符串以
\n
结尾,它只使用
puts
)。@nneonneo,目前。您不知道GCC 5.0是否每次都会以内联方式扩展
memcpy
,也不知道具体在什么情况下扩展。此外,OP询问了这个具体案例,但可能希望将答案应用于其他案例。或者有人可以找到这个问题(和答案)寻找类似的东西。在C语言中,编译后的程序的行为必须与函数调用和其他操作的编写顺序相同。如果编译器可以证明不同的代码总是给出相同的结果,那么可以随意替换它。呃,好吧,如果GCC内联了所有(或大部分)的
memcpy
,那么在GDB中使用
si
,仍然可以让您看到
memcpy
:)