2013-10-15 8 views
11

Voglio creare un registro errori che fornisca il file e la linea che il problema sta utilizzando. Ma non ho trovato un buon riferimento. Tutto il codice utilizza il lato JNI, C++.Definire la macro per registrare l'errore con file e riga in Android

Questa Prova venga meno

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

Questo mostrare solo il msg, non il file e la linea

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

Come ho potuto stampare tutte le informazioni in modo chiaro? È possibile stampare solo alcuni argomenti da __VA_ARGS__, ad esempio __VA_NARG__? Ulteriori informazioni o riferimenti utili per questo genere di cose?

risposta

14

Domanda molto interessante e utile! Ho trovato questa soluzione, che non può essere il più semplice, ma funziona per me:

#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) 

Questa linea:

LOGE("Test: %i", 42) 

registrato il seguente:

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

Attenzione al arbitraria 512 lunghezza del buffer se si intende registrare più cose!

Spero che questo aiuti!

+2

È possibile utilizzare 'snprintf()' per garantire che non si superi inavvertitamente la dimensione del buffer da 512 byte. – technomage

+0

Sì, ci ho pensato, ma ho optato per la soluzione più semplice, assumendo che la maggior parte dei log non sia molto lunga. Ma è bello menzionare anche 'snprintf'! – mbrenon

1

ho optato per questo:

#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

Si può usare qualcosa di simile (modificandolo in base alle vostre esigenze):

#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__) 

e nel codice può essere utilizzato in questo modo:

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

Questo è antico, ma l'ho trovato mentre cercavo la stessa cosa. Tuttavia, sono riuscito a mettere insieme una soluzione migliore da più fonti.

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

Si noti che lo standard ## __VA_ARGS__ non è standard. Funziona su GCC e clang però, quindi nessun problema con Android.