WPA_SUPPLICANT的LOG列印資訊分析與調整
阿新 • • 發佈:2019-01-28
http://androidxref.com/8.0.0_r4
// MSG_INFO預設列印 MSG_DEBUG 預設不列印 wpa_msg(wpa_s, MSG_INFO, "Associated with " MACSTR, MAC2STR(bssid)); wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s",wpa_supplicant_state_txt(wpa_s->wpa_state),wpa_supplicant_state_txt(state)); // #define wpa_dbg(args...) wpa_msg(args) //wpa_dbg最終也呼叫到 wpa_msg int wpa_debug_level = MSG_INFO; //列印日誌的級別預設為MSG_INFO 【4】 //那麼意味著 MSG_EXCESSIVE 【1】, MSG_MSGDUMP 【2】, MSG_DEBUG 【3】 將不列印 不會輸出很多有用資訊 措施1: 在程式碼中修改此處 預設為 int wpa_debug_level = MSG_DEBUG; 措施2: 編譯時的 prject_xxx.rc 檔案中的 service wpa_supplicant /system/bin/wpa_supplicant 多幾個 -dddd 提高列印級別 措施3: 在開發者模式下選中 啟動WLAN詳細日誌記錄功能 按鈕 enum { MSG_EXCESSIVE 【1】, MSG_MSGDUMP 【2】, MSG_DEBUG 【3】, MSG_INFO 【4】, MSG_WARNING 【5】, MSG_ERROR【6】 }; void wpa_msg(void *ctx, int level, const char *fmt, ...) { va_list ap; char *buf; int buflen; int len; char prefix[130]; va_start(ap, fmt); buflen = vsnprintf(NULL, 0, fmt, ap) + 1; va_end(ap); buf = os_malloc(buflen); if (buf == NULL) { wpa_printf(MSG_ERROR, "wpa_msg: Failed to allocate message " "buffer"); return; } va_start(ap, fmt); prefix[0] = '\0'; if (wpa_msg_ifname_cb) { const char *ifname = wpa_msg_ifname_cb(ctx); if (ifname) { int res = os_snprintf(prefix, sizeof(prefix), "%s: ", ifname); if (os_snprintf_error(sizeof(prefix), res)) prefix[0] = '\0'; } } len = vsnprintf(buf, buflen, fmt, ap); va_end(ap); wpa_printf(level, "%s%s", prefix, buf); // 呼叫到此處 把當前 MSG_XXX 傳入 if (wpa_msg_cb) wpa_msg_cb(ctx, level, WPA_MSG_PER_INTERFACE, buf, len); bin_clear_free(buf, buflen); } void wpa_printf(int level, const char *fmt, ...) { va_list ap; va_start(ap, fmt); // 如果當前的等級大於 預設等級 列印輸出, 小於預設等級則不輸出 // MSG_DEBUG 【3】小於MSG_INFO 【4】 所以一般不輸出 直接 if(false) 跳過了 if (level >= wpa_debug_level【 MSG_INFO 4】) { __android_log_vprint(wpa_to_android_level(level),ANDROID_LOG_NAME, fmt, ap); if (wpa_debug_syslog) { vsyslog(syslog_priority(level), fmt, ap); } else { wpa_debug_print_timestamp(); if (out_file) { vfprintf(out_file, fmt, ap); fprintf(out_file, "\n"); } else { vprintf(fmt, ap); printf("\n"); } } } va_end(ap); if (wpa_debug_tracing_file != NULL) { va_start(ap, fmt); fprintf(wpa_debug_tracing_file, WPAS_TRACE_PFX, level); vfprintf(wpa_debug_tracing_file, fmt, ap); fprintf(wpa_debug_tracing_file, "\n"); fflush(wpa_debug_tracing_file); va_end(ap); } } static int wpa_to_android_level(int level) { if (level == MSG_ERROR) return ANDROID_LOG_ERROR; if (level == MSG_WARNING) return ANDROID_LOG_WARN; if (level == MSG_INFO) return ANDROID_LOG_INFO; // MSG_INFO return ANDROID_LOG_DEBUG; // MSG_DEBUG } typedef enum android_LogPriority { ANDROID_LOG_UNKNOWN = 0, ANDROID_LOG_DEFAULT, ANDROID_LOG_VERBOSE, ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_FATAL, ANDROID_LOG_SILENT, } android_LogPriority;