Tôi đang tìm cách thông minh để theo dõi các cuộc gọi và trả về chức năng. Tôi biết tôi có thể sử dụng trình gỡ rối, nhưng tôi muốn một cách để chỉ in nó ra thiết bị đầu cuối khi gọi một hàm và phải bước qua mã.
Tôi nghĩ rằng tôi có thể sử dụng bộ tiền xử lý, nhưng tôi không chắc chắn điều gì sẽ là cách tốt nhất để thực hiện điều này.
Hoặc có cách nào để sử dụng gdb để in ra thông tin hữu ích, trong khi không phải bước qua mã.C/C++ cần một cách thông minh để theo dõi các cuộc gọi chức năng
Trả lời
Hoặc là có một cách để sử dụng gdb để in ra các thông tin mà sẽ có ích, trong khi không phải bước qua mã
Yes. Đặt điểm ngắt chỉ ở các hàm mà bạn thực sự quan tâm. Sử dụng "tiếp tục" cho đến khi bạn nhận được các chức năng đó hoặc cho đến khi chương trình của bạn bị treo. Sau đó sử dụng "backtrace" (hoặc "bt") để có được một dấu vết stack.
#define BEGIN_FUNC(X) printf("Function %s Entered",X)
#define END_FUNC(X) printf("Function %s End",X)
foo()
{
BEGIN_FUNC(__func__);
//Your code here
END_FUNC(__func__);
}
Tôi nghĩ nếu bạn viết macro như trên và sử dụng nó cho mọi chức năng như được mô tả thì bạn có thể nhận nhật ký trên thiết bị đầu cuối.
+1 Câu trả lời của tôi thiếu – PostMan
Điều này về cơ bản là cách lược tả xâm lấn thực hiện điều đó. –
Đây là những gì tôi làm nhiều lần ... Một kỹ thuật tốt ... – Microkernel
Có một macro __FUNCTION__
(Reference) được sử dụng để xác định phương thức nào (ở định dạng Class::Method
) bạn đang tham gia, nhưng đây là quy trình thủ công hơn.
Tuy nhiên, khi tôi cần cùng một thông tin 'theo dõi' gần đây, tôi không thể tìm thấy phương pháp tự động.
Bạn có thể muốn xem Valgrind's Callgrind có thể theo dõi các cuộc gọi hàm thành biểu đồ đẹp. Nó sẽ hiển thị các cuộc gọi hàm, nhưng không hiển thị các tham số hoặc trả về giá trị.
Hầu hết các trình biên dịch đều cho phép bạn chèn một hàm thiết bị trước và sau khi thực hiện cuộc gọi hàm.
trong msvc họ _penter và _pexit
đẹp bài viết http://www.drdobbs.com/184403601
trong gcc bạn sẽ sử dụng -finstrument chức năng
http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Code-Gen-Options.html
Bạn có thể sử dụng libaries debug hoặc các tập tin bản đồ để biết thêm thông tin .
Bạn sẽ không xảy ra tp biết cách tìm kiếm hàm trong bảng biểu tượng trong gcc –
Bạn có muốn tìm tên hoặc tra cứu mọi thứ không như các tham số vv trong các đối tượng gỡ lỗi? –
Chỉ cần tên sẽ là tốt. #delay – reader
Nếu bạn cần tự động hóa, bạn có thể xem TARGET_ASM_FUNCTION_END_PROLOGUE
và TARGET_ASM_FUNCTION_BEGIN_EPILOGUE
. Đây là các trình biên dịch sẽ cho phép bạn chỉ định các phần của assembly được phát ra cùng với phần mở đầu của hàm bình thường - trong trường hợp của bạn, bạn sử dụng chúng để phát ra một assembly nhỏ để đăng nhập/thoát khỏi hàm đang được đề cập . Bạn cũng có thể xem FUNCTION_PROFILE
và/hoặc PROFILE_HOOK
(ví dụ: tại: http://gcc.gnu.org/onlinedocs/gccint/Function-Entry.html).
Một giải pháp khá phức tạp đang sử dụng RAII để kiểm soát phạm vi chức năng.Điều này sẽ có ảnh hưởng lớn trong hoạt động, nhưng sẽ khá rõ ràng trong các bản ghi mà không đòi hỏi người sử dụng thêm thiết bị đo đạc trong tất cả các đường dẫn mã có thể là có thể để lại các chức năng:
class ScopeLogger {
public:
ScopeLogger(std::string const & msg) : msg(msg)
{ std::cout << "Enter: " << msg << std::endl; }
~ScopeLogger()
{ std::cout << "Exit: " << msg << std::endl; }
std::string msg;
};
#if DEBUG
#define FUNCTION(x) ScopeLogger l_##x##_scope(x);
#endif
void foo(int value) {
FUNCTION(__FUNCTION__);
if (value > 10) throw std::exception;
std::cout << "." << std::endl;
}
int main() {
foo(0); // Enter: foo\n.\nExit: foo
foo(100); // Enter: foo\nExit: foo
}
Nếu mã là ren duy nhất, bạn thậm chí còn muốn thêm một biến tĩnh bằng một mức độ thụt đầu dòng để ScopedLogger
mà không cần thêm là quá nhiều để ảnh hưởng hiệu suất đã nặng:
class ScopeLogger {
public:
ScopeLogger(std::string const & msg) : msg(msg)
{ std::cout << std::string(indent++,' ') << "Enter: " << msg << std::endl; }
~ScopeLogger()
{ std::cout << std::string(--indent,' ') << "Exit: " << msg << std::endl; }
std::string msg;
static int indent;
};
int ScopeLogger::indent = 0;
Khá xâm nhập, nhưng ít hơn của Praveen. – Stephen
Mã của bạn có biên dịch không? Trường hợp là contructor cho 'std :: string' để làm cho chuỗi' std :: (indent ++, "") 'hợp lệ? –
@ bruce.banner: Tốt bắt, đó là những gì sẽ xảy ra khi bạn nhập vào một trang web thay vì trong một trình soạn thảo và biên dịch. Đối số thứ hai * phải là * một 'char', không phải là một' char * '(tức là tôi đã có nhầm lẫn gấp đôi trong đó dấu nháy đơn được yêu cầu). Ở bất kỳ mức nào, hãy sử dụng ý tưởng này như một ý tưởng, mã có các vấn đề khác, bao gồm nhưng có lẽ không giới hạn đối với an toàn luồng (hoặc thiếu nó). –
Vì bạn đang sử dụng GCC, bạn cũng có thể sử dụng trình liên kết chức năng gói.
Link-Time Replacement/Wrapping
– GCC option: -Wl,--wrap,function_name
Về cơ bản, bạn có thể thực hiện chức năng gọi là "__wrap_function_name()". Bạn có thể truy cập chức năng ban đầu bằng cách gọi "__real_function_name()".
Một thời gian trước, tôi đã nghe một cuộc trò chuyện về lập trình hướng đối tượng bao gồm những gì bạn muốn đạt được. Có lẽ một tìm kiếm cho thuật ngữ đó sẽ giúp.
- 1. cách theo dõi cuộc gọi hàm trong C?
- 2. Cụ thể về cuộc gọi/cc
- 3. Bộ chức năng thông minh hoàn toàn
- 4. gọi sizeof trên một cuộc gọi bỏ qua chức năng thực sự gọi chức năng!}
- 5. Sử dụng cuộc gọi chức năng trong vòng lặp foreach
- 6. Cách theo dõi quy trình cho cuộc gọi hệ thống?
- 7. C++ chức năng cuộc gọi nhận dạng
- 8. C++: Các chức năng ảo cần gọi cùng một mã?
- 9. Cần gọi chức năng gốc từ chức năng bị ngắt
- 10. CodeIgniter chức năng cuộc gọi trong cùng một lớp
- 11. Các cuộc gọi chức năng bị trì hoãn
- 12. trích xuất tên cuộc gọi chức năng từ một cuộc gọi hàm
- 13. cách lấy doxygen để tạo biểu đồ cuộc gọi & người gọi cho các chức năng c
- 14. Trong cuộc gọi AJAX, 302 không được theo dõi
- 15. Theo dõi thời lượng cuộc gọi điện thoại
- 16. Sử dụng Moq để xác minh các cuộc gọi được thực hiện theo đúng thứ tự
- 17. Vượt qua một chức năng như một cuộc tranh luận đầu tiên trong một cuộc gọi chức năng trong coffeescript
- 18. jquery chức năng cuộc gọi bằng tên
- 19. Ngăn các cuộc gọi chức năng cũ Trong VB.NET
- 20. Echo một cuộc gọi chức năng từ dòng lệnh vim
- 21. Giao dịch PDO và các cuộc gọi chức năng
- 22. chức năng gọi lỗi, [Cuộc gọi đến chức năng PInvoke không cân bằng chồng]
- 23. Whats cách tốt nhất để gửi QStrings trong một cuộc gọi chức năng là gì?
- 24. Tại sao chức năng Clojure chỉ bao gồm các cuộc gọi chức năng lười biếng?
- 25. Chức năng javascript cuộc gọi có tên là biến
- 26. Gọi/cc là gì?
- 27. Cố gắng ràng buộc một cuộc gọi lại bằng cách truyền chức năng ném lỗi
- 28. Danh sách tất cả các cuộc gọi chức năng được thực hiện trong một ứng dụng
- 29. Chức năng cơ sở cuộc gọi sau đó được thừa kế chức năng
- 30. Khi nào cần kiểm tra EINTR và lặp lại cuộc gọi chức năng?
Cảm ơn bạn đã quay lại, hoạt động tốt. –