使用gdb进入GNU函数

3

我想了解C语言的memcpy函数的内部工作原理,是否可以使用gdb进入该函数进行调试?

1个回答

5
当你到达一个memcpy调用时,使用si(步进指令)进入汇编代码。
只有在您拥有libc的调试版本和glibc源码的情况下,您才能获取源代码。
如果您只想查看实现,请查看例如memcpy-ssse3.Smemcpy.S

没有人说编译器不能将函数展开成一行,或者用其他东西替换它(例如,GCC将printf("Some constant string");替换为puts("Some constant string");)。 - vonbrand
@vonbrand:确实如此,但这只发生在 memcpy 的罕见情况下(实际上只有在复制在可证明对齐边界上的常量大小小数据片段时才会发生)。更常见的是 GCC 在执行结构体赋值时插入调用 memcpy。 (吹毛求疵:如果常量字符串以 \n 结尾,则它只使用 puts)。 - nneonneo
@nneonneo,目前你不知道GCC 5.0是否会每次都内联扩展memcpy,或者在哪些确切情况下会这样做。此外,OP要求针对特定情况进行回答,但可能还想将答案应用于其他情况。或者有人可能会寻找类似的问题(和答案)。在C语言中,编译后的程序必须表现得好像函数调用和其他操作是按照写入的顺序完成的。如果编译器可以证明不同的代码始终产生相同的结果,则可以自由替换它。 - vonbrand
嗯,如果GCC内联了所有(或大部分)的memcpy,那么在GDB中使用si仍然可以让您看到memcpy的汇编代码 :) - nneonneo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接