C++ 英特尔管脚:与默认工具一起使用时,两次检测“malloc”
我使用了英特尔官方网站上发布的pin工具: 现在,在我发布的代码中有几个C++ 英特尔管脚:与默认工具一起使用时,两次检测“malloc”,c++,c,x86,profiling,intel-pin,C++,C,X86,Profiling,Intel Pin,我使用了英特尔官方网站上发布的pin工具: 现在,在我发布的代码中有几个malloc调用: char *str = (char*)malloc(15); char * xx = (char*)malloc(30); 但是,正如您在上面的输出中所注意到的,检测到两个malloc函数调用: malloc(0xf) malloc(0xf) 我相信这些对应于malloc(15)(注意,对于malloc(30),情况并非如此)。你能告诉我为什么会这样吗?我们也只能检测一次这样的呼叫 Objdump:
malloc
调用:
char *str = (char*)malloc(15);
char * xx = (char*)malloc(30);
但是,正如您在上面的输出中所注意到的,检测到两个malloc函数调用:
malloc(0xf)
malloc(0xf)
我相信这些对应于malloc(15)
(注意,对于malloc(30)
,情况并非如此)。你能告诉我为什么会这样吗?我们也只能检测一次这样的呼叫
Objdump:
马洛克:
0000000000400500 <malloc@plt>:
400500: ff 25 2a 0b 20 00 jmp QWORD PTR [rip+0x200b2a] # 601030 <malloc@GLIBC_2.2.5>
400506: 68 03 00 00 00 push 0x3
40050b: e9 b0 ff ff ff jmp 4004c0 <.plt>
0000000000 400500:
400500:ff 25 2a 0b 20 00 jmp QWORD PTR[rip+0x200b2a]#601030
400506:68 03 00推0x3
40050b:e9 b0 ff ff jmp 4004c0
我主要职能的一部分:
int i;
char *str = (char*)malloc(15);
40063a: bf 0f 00 00 00 mov edi,0xf
40063f: e8 bc fe ff ff call 400500 <malloc@plt>
400644: 48 89 45 f0 mov QWORD PTR [rbp-0x10],rax
char * xx = (char*)malloc(30);
400648: bf 1e 00 00 00 mov edi,0x1e
40064d: e8 ae fe ff ff call 400500 <malloc@plt>
400652: 48 89 45 e8 mov QWORD PTR [rbp-0x18],rax
inti;
char*str=(char*)malloc(15);
40063a:bf 0f 00 mov edi,0xf
40063f:e8 bc fe ff ff呼叫400500
400644:48 89 45 f0 mov QWORD PTR[rbp-0x10],rax
char*xx=(char*)malloc(30);
400648:bf 1e 00 mov edi,0x1e
40064d:e8 ae fe ff ff呼叫400500
400652:48 89 45 e8 mov QWORD PTR[rbp-0x18],rax
注意只有几个malloc调用。Pin工具看起来不错。请注意,
malloc(0x1e)
对应于malloc(30)
。我想不知何故,malloc(0xf)
被调用了两次。使用objdump
检查编译器生成的汇编代码。在x86-64 Linux上使用gcc-Og
编译测试程序(而不是PIN工具),并使用ltrace
跟踪其库函数调用,我只看到预期的2个malloc
调用。您是否尝试过在malloc
上设置断点,以查看是否确实有来自某处的第二次调用?也许可以尝试使用-fno plt
进行编译。可能是惰性动态链接导致程序中的第一个调用被看到两次。(虽然libc中真正的malloc函数只被调用一次;但通过PLT存根的第一个函数不会直接跳转到malloc。如果您想看到PLT运行,第一次调用只需一步,然后第二次调用就可以了。嗯…(1)您使用的是哪种Pin版本?(2)您使用哪些编译器、版本和编译器选项来编译代码?(3)您是如何编译Pin工具的?我将尝试看看是否可以在我的系统上复制此工具。我无法使用gcc 5.4、gcc 7.3或gcc 8.1复制此行为。我在每个malloc
调用的跟踪中只得到一个malloc
调用。Pin工具看起来不错。请注意malloc(0x1e)
对应于malloc(30)
。我想不知何故,malloc(0xf)
被调用了两次。请使用objdump
检查编译器生成的汇编代码。编译测试程序(而不是PIN工具)使用x86-64 Linux上的gcc-Og
,并使用ltrace
跟踪其库函数调用,我只看到预期的2个malloc
调用。您是否尝试在malloc
上设置断点以查看是否真的有来自某处的第二次调用?可能尝试使用-fno plt
进行编译。可能是惰性动态的链接会导致程序中的第一个调用出现两次。(虽然libc中真正的malloc函数只被调用一次;第一个通过PLT存根,它不会直接跳转到malloc。如果你想看到PLT运行,第一次调用只需一步,然后第二次调用。嗯…(1)你使用的是哪个Pin版本?(2)您使用哪种编译器、版本和编译器选项来编译代码?(3)您如何编译Pin工具?我将尝试在我的系统上复制此工具。我无法使用gcc 5.4、gcc 7.3或gcc 8.1复制行为。我在跟踪中只得到一个malloc
调用,每个malloc
调用。
malloc(0xf)
malloc(0xf)
0000000000400500 <malloc@plt>:
400500: ff 25 2a 0b 20 00 jmp QWORD PTR [rip+0x200b2a] # 601030 <malloc@GLIBC_2.2.5>
400506: 68 03 00 00 00 push 0x3
40050b: e9 b0 ff ff ff jmp 4004c0 <.plt>
int i;
char *str = (char*)malloc(15);
40063a: bf 0f 00 00 00 mov edi,0xf
40063f: e8 bc fe ff ff call 400500 <malloc@plt>
400644: 48 89 45 f0 mov QWORD PTR [rbp-0x10],rax
char * xx = (char*)malloc(30);
400648: bf 1e 00 00 00 mov edi,0x1e
40064d: e8 ae fe ff ff call 400500 <malloc@plt>
400652: 48 89 45 e8 mov QWORD PTR [rbp-0x18],rax