7.8. 編譯器和開發工具 (機器翻譯)

GCC生成的綜合函數會混淆SystemTap

GCC優化可以為其他函數的部分內聯副本生成合成函數。SystemTap和GDB等工具無法將這些合成函數與實際函數區分開來。因此,SystemTap可以在合成和實際功能入口點上放置探針,從而為單個實際函數調用註冊多個探針命中。

要解決此問題,必須使用諸如檢測遞歸和抑制與內聯部分函數相關的探針等措施來調整SystemTap腳本。例如,一個腳本

probe kernel.function("can_nice").call { }

可以嘗試避免所描述的問題如下:

global in_can_nice%

probe kernel.function("can_nice").call {
  in_can_nice[tid()] ++;
  if (in_can_nice[tid()] > 1) { next }
  /* code for real probe handler */
}

probe kernel.function("can_nice").return {
  in_can_nice[tid()] --;
}

請注意,此示例腳本未考慮所有可能的方案,例如錯過的kprobes或kretprobes,或者真正意圖的遞歸。

(BZ#1169184)

ltrace 工具不報告函數調用

由於改進了應用於所有RHEL組件的二進制加固,因此 ltrace 工具無法再檢測來自RHEL組件的二進製文件中的函數調用。作為結果, ltrace 輸出為空,因為在此類二進製文件上使用時,它不會報告任何檢測到的調用。目前沒有可用的解決方法。

作為一個說明, ltrace 可以正確地報告在沒有相應強化標誌的情況下構建的自定義二進製文

(BZ#1618748, BZ#1655368)