Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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++ 英特尔管脚:与默认工具一起使用时,两次检测“malloc”_C++_C_X86_Profiling_Intel Pin - Fatal编程技术网

C++ 英特尔管脚:与默认工具一起使用时,两次检测“malloc”

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:

我使用了英特尔官方网站上发布的pin工具:

现在,在我发布的代码中有几个
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