为什么在GDB下运行一个程序执行的指令数有差异?

Why is there is difference in number of instructions executed by a program when it is running under GDB?

我正在使用 ARM PMU 计数器来计算进程在两次系统调用之间执行的指令数。特别是我使用 "INST_RETIRED" 事件来计算用户模式下进程执行的指令数。 Reference: ARMv7 R/A Reference Manual。如果我 运行 在自由模式下或在 GDB 下运行程序,指令的数量是一致的。当我尝试使用 pthread_create 创建线程时出现问题。当我在 GDB 下 运行 时,同一程序在两个系统调用 mprotect 和 clone(均由函数 pthread_create 执行)之间执行的指令数不同。这意味着用户程序在调试器下 运行ning 时正在执行一些不同的代码,可能在库 libpthread 中。我看过 pthread_create 的源代码,但找不到与 trace/debug 标志相关的任何内容。谁能指导我,那么这种歧义来自哪里?

I have seen the source code of pthread_create but could not find anything related to trace/debug flags

其实有这样的代码here and herereport_events 仅在调试器下 运行 时设置为真。