Thỉnh thoảng tôi phải theo dõi rất nhiều cuộc gọi hàm, ngay cả đối với thư viện bên ngoài, tôi không có bất kỳ điều khiển nào hoặc tôi không muốn sửa đổi. Cách đây không lâu, tôi nhận ra rằng bạn có thể kết hợp các điểm ngắt biểu thức chính quy của gdb (các nút thông thường là ok) và sau đó chỉ cần thực hiện một tập lệnh để chạy mỗi khi các điểm ngắt được kích hoạt. Xem: http://www.ofb.net/gnu/gdb/gdb_35.html
Ví dụ, nếu bạn muốn theo dõi tất cả các chức năng mà bắt đầu với "MPI_" tiền tố, bạn có thể làm:
(gdb) rbreak MPI_
[...]
(gdb) command 1-XX
(gdb) silent
(gdb) bt 1
(gdb) echo \n\n
(gdb) continue
(gdb) end
Im lặng lệnh được sử dụng để che giấu thông điệp gdb khi một breakpoint được tìm thấy . Tôi thường in một vài dòng trống, để dễ đọc hơn.
Sau đó, bạn chỉ cần chạy chương trình: (gdb) chạy
Khi chương trình của bạn bắt đầu chạy, gdb sẽ in các mức backtrace topmost N.
#0 0x000000000040dc60 in [email protected]()
#0 PMPI_Initialized (flag=0x7fffffffba78) at ../../src/mpi/init/initialized.c:46
#0 0x000000000040d9b0 in [email protected]()
#0 PMPI_Init_thread (argc=0x7fffffffbe78, argv=0x7fffffffbde0, required=3, provided=0x7fffffffba74) at ../../src/mpi/init/initthread.c:946
#0 0x000000000040e390 in [email protected]()
#0 PMPI_Comm_rank (comm=1140850688, rank=0x7fffffffba7c) at ../../src/mpi/comm/comm_rank.c:53
#0 0x000000000040e050 in [email protected]()
#0 PMPI_Type_create_struct (count=3, array_of_blocklengths=0x7fffffffba90, array_of_displacements=0x7fffffffbab0, array_of_types=0x7fffffffba80, newtype=0x69de20) at ../../src/mpi/datatype/type_create_struct.c:116
#0 0x000000000040e2a0 in [email protected]()
#0 PMPI_Type_commit (datatype=0x69de20) at ../../src/mpi/datatype/type_commit.c:75
Nếu bạn muốn có thông tin chi tiết hơn, in ấn các biến cục bộ của một breakpoint được cũng có thể, chỉ cần chèn nhiều lệnh giữa command
và end
.
Mẹo bổ sung: thêm tất cả các tệp này vào tệp .gdbinit
của bạn và thực thi đường dẫn vào tệp.
Nguồn
2016-08-24 13:11:52
Sử dụng trình gỡ lỗi. Hoặc gọi một số hình thức đăng nhập fprintf vào một tập tin. Nhưng có lẽ các tùy chọn cuối cùng sẽ không tốt vì bạn không muốn sửa đổi mã nguồn. – Lefteris
Có thể một profiler để có được một đồ thị cuộc gọi? –
Bạn đang tìm kiếm một cái gì đó như thế? http://stackoverflow.com/questions/311840/tool-to-trace-local-function-calls-in-linux – delannoyk