Определить макрос для ошибки журнала с файлом и строкой в android
Я хочу создать журнал ошибок, которые вызывают в файле и строке проблему. Но я не нашел хорошей справки. Весь код использует JNI, С++.
Эта попытка пробоя:
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , LOG_TAG,"%s %s %s",__VA_ARGS__, __FILE__, __LINE__)
В этом показан только msg, нет файла и строки
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , LOG_TAG,__VA_ARGS__, __FILE__, __LINE__)
Как я могу напечатать всю информацию четко?
Можно ли печатать только некоторые аргументы из __VA_ARGS__
, что-то вроде __VA_NARG__
?
Дополнительная информация или полезные ссылки для такого рода вещей?
Ответы
Ответ 1
Очень интересный и полезный вопрос! Я нашел это решение, которое может быть не самым простым, но работает для меня:
#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)
Эта строка:
LOGE("Test: %i", 42)
регистрирует следующее:
TAG Test: 42 | path/to/file.cpp:line
Остерегайтесь произвольной длины буфера 512
, если вы собираетесь записывать более длинные вещи!
Надеюсь, это поможет!
Ответ 2
Я решил:
#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__)
Ответ 3
Вы можете использовать что-то вроде этого (изменяя его в соответствии с вашими потребностями):
#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__)
и в коде его можно использовать следующим образом:
LOGD("TAG", "debug message");
LOGE("TAG", "error message");
std::string msg = "dynamic message";
LOGD("TAG", "%s", msg.c_str());
Ответ 4
Это древний, но я натолкнулся на это, когда искал одно и то же. Однако мне удалось собрать лучшее решение из нескольких источников.
#define LOGV(fmt, ...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, "Your Tag", "%s: " fmt, __FUNCTION__, ## __VA_ARGS__))
Вы должны заметить, что ## __VA_ARGS__
не является стандартным. Работы на GCC и clang, хотя, поэтому никаких проблем с Android.