Rất dễ thay đổi gprof để lập hồ sơ đồng hồ treo tường. Đã có 8 ký tự chỉ để thay thế là:
ITIMER_PROF -> ITIMER_REAL
SIGPROF -> SIGALRM
trong file glibc/sysdeps/posix/profil.c
, hoạt __profil
, gần các cuộc gọi đến setitimer
và sigaction
(chính xác hơn __Setitimer
và __sigaction
)
Sau khi thay đổi bất kỳ chương trình trong đó sử dụng SIGALRM sẽ bị hỏng và bất kỳ chương trình nào không có mã khởi động lại chặn-syscall có thể cho kết quả sai.
Ngoài ra, bạn có thể trực tiếp thay đổi giá trị int trong hệ nhị phân glibc (xin vui lòng, không làm điều này trên hệ thống rộng libc.so
, tạo một bản sao riêng biệt và cung cấp cho nó để chương trình với LD_LIBRARY_PATH)
Đối vá nhị phân, ITIMER_PROF là 2 ; ITIMER_REAL là 0; SIGPROF là 27 (0x1b); SIGALRM là 14 (0x0e). Có hai vị trí cho mỗi hằng số trong hàm profil
của glibc.
Cách khác là viết trình gỡ lỗi ptrace, sẽ thay đổi đối số của hàm setitimer và sigaction tại thời gian chạy.
Bạn có thể muốn một cái gì đó khác hơn là gprof cho việc này. – WhirlWind
Chẳng hạn như ví dụ gì? – jetwolf
hãy xem dtrace, tùy thuộc vào kiến trúc của bạn. – WhirlWind