2013-10-15 13 views
11

Tôi muốn tạo Nhật ký Lỗi để giải quyết vấn đề đang sử dụng. Nhưng tôi đã không tìm thấy một tài liệu tham khảo tốt. Tất cả các mã đang sử dụng JNI, bên C++.Xác định macro để đăng nhập lỗi với tệp và dòng trong android

này Cố gắng thất bại:

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , LOG_TAG,"%s %s %s",__VA_ARGS__, __FILE__, __LINE__) 

Cái này chỉ hiển thị msg, không có các tập tin và dòng

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , LOG_TAG,__VA_ARGS__, __FILE__, __LINE__) 

Làm thế nào tôi có thể in tất cả các thông tin rõ ràng không? Chỉ có thể in một số đối số từ __VA_ARGS__, chẳng hạn như __VA_NARG__? Thông tin bổ sung hoặc tài liệu tham khảo hữu ích cho loại sự việc này?

Trả lời

14

Câu hỏi rất thú vị và hữu ích! Tôi tìm thấy giải pháp này, trong đó có thể không phải là đơn giản, nhưng làm việc cho tôi:

#define LOGE(x...) do { \ 
    char buf[512]; \ 
    sprintf(buf, x); \ 
    __android_log_print(ANDROID_LOG_ERROR,"TAG", "%s | %s:%i", buf, __FILE__, __LINE__); \ 
} while (0) 

dòng này:

LOGE("Test: %i", 42) 

ghi lại như sau:

TAG Test: 42 | path/to/file.cpp:line 

Beware of the tùy ý 512 chiều dài của bộ đệm nếu bạn có ý định đăng nhập những thứ dài hơn!

Hy vọng điều này sẽ hữu ích!

+2

Bạn có thể sử dụng 'snprintf()' để đảm bảo rằng bạn không vô tình vượt quá kích thước bộ đệm 512 byte của mình. – technomage

+0

Có, tôi nghĩ về nó nhưng đã đi cho các giải pháp đơn giản nhất, giả sử rằng hầu hết các bản ghi không phải là rất dài. Nhưng đó là tuyệt vời để đề cập đến 'snprintf' quá! – mbrenon

1

tôi giải quyết về vấn đề này:

#define TP_STR_HELPER(x) #x 
#define TP_STR(x) TP_STR_HELPER(x) 

#define DLog(fmt, ...) __android_log_print(ANDROID_LOG_DEBUG, "BLAH", "%s:%s " fmt "\n", __PRETTY_FUNCTION__, TP_STR(__LINE__), ##__VA_ARGS__) 
1

Bạn có thể sử dụng một cái gì đó như thế này (sửa đổi nó theo yêu cầu của bạn):

#include <android/log.h> 
#define LOGD(tag, fmt, ...) __android_log_print(ANDROID_LOG_DEBUG, tag, fmt "\n--> %s\n----> %s:%d", ##__VA_ARGS__, __FILE__, __FUNCTION__, __LINE__) 
#define LOGE(tag, fmt, ...) __android_log_print(ANDROID_LOG_ERROR, tag, fmt "\n--> %s\n----> %s:%d", ##__VA_ARGS__, __FILE__, __FUNCTION__, __LINE__) 

và trong mã nó có thể được sử dụng như thế này:

LOGD("TAG", "debug message"); 
LOGE("TAG", "error message"); 
std::string msg = "dynamic message"; 
LOGD("TAG", "%s", msg.c_str()); 
1

Đây là cổ đại, nhưng tôi đã xem qua nó khi tìm kiếm cùng một thứ. Tuy nhiên, tôi đã tập hợp một giải pháp tốt hơn từ nhiều nguồn.

#define LOGV(fmt, ...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, "Your Tag", "%s: " fmt, __FUNCTION__, ## __VA_ARGS__)) 

Bạn nên lưu ý rằng ## __VA_ARGS__ không phải là tiêu chuẩn mặc dù. Hoạt động trên GCC và clang mặc dù, do đó, không có vấn đề với Android.

Các vấn đề liên quan