Определить макрос для ошибки журнала с файлом и строкой в ​​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.