Arm 为什么程序在GDB下运行时执行的指令数量会有差异?

Arm 为什么程序在GDB下运行时执行的指令数量会有差异?,arm,gdb,pthreads,glibc,performance-monitor,Arm,Gdb,Pthreads,Glibc,Performance Monitor,我使用ARM PMU计数器计算一个进程在两个系统调用之间执行的指令数。特别是,我使用“INST_RETIRED”事件统计用户模式下进程执行的指令数。如果在自由模式或GDB模式下运行程序,则指令数是一致的。当我尝试使用pthread_create创建线程时,问题就出现了。在GDB下运行时,同一程序在两个系统调用mprotect和clone(均由函数pthread_create执行)之间执行的指令数不同。这意味着用户程序在调试器下运行时正在执行一些不同的代码,可能在libpthread库中。我已经看

我使用ARM PMU计数器计算一个进程在两个系统调用之间执行的指令数。特别是,我使用“INST_RETIRED”事件统计用户模式下进程执行的指令数。如果在自由模式或GDB模式下运行程序,则指令数是一致的。当我尝试使用pthread_create创建线程时,问题就出现了。在GDB下运行时,同一程序在两个系统调用mprotect和clone(均由函数pthread_create执行)之间执行的指令数不同。这意味着用户程序在调试器下运行时正在执行一些不同的代码,可能在libpthread库中。我已经看过pthread_create的源代码,但找不到任何与跟踪/调试标志相关的内容。有人能告诉我这辆车是从哪里来的吗

我已经看过pthread_create的源代码,但找不到任何与跟踪/调试标志相关的内容


事实上,有这样的守则和规则<代码>报告事件仅在调试器下运行时设置为true。

因为我使用的是较旧版本的Glibc(2.17)。我在pthread_create.c中找不到此签入。事实证明,对于我的特定版本的glibc,在函数
create_-thread(struct-pthread*pd,const-struct-pthread_-attr*attr,…)中的createthread.c文件中对线程创建进行了这样的检查。谢谢你指引了正确的道路!请允许我再问一件事,为什么pthread_create是在glibc中定义的,它不应该是libpthread源代码的一部分吗?@JinaLee glibc由大约200多个库组成:
libc.so.6
libpthread.so.0
ld linux.so.2
libdl.so.2
,等等。如果不与
libc
内部进行深入集成,就不可能实现
libpthread