Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4886|回复: 10
打印 上一主题 下一主题

调试方法--日志

[复制链接]

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
跳转到指定楼层
楼主
发表于 2015-10-12 23:19:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hechengjin 于 2015-12-16 16:36 编辑

1.查看界面元素的扩展下载安装

dom_inspector-2.0.14-sm+fn+tb+fx.xpi
addon-332239-latest.xpi
在需要查看的元素上按“Shift + 鼠标右键”,将自动弹出 DOM Inspector 并定位到该元素上。
参看源码路径:ExMail/ExTools/Extend  下的 addon-332239-latest.xpi 和dom_inspector-2.0.14-sm+fn+tb+fx.xpi文件

11.远程js调试https://addons.mozilla.org/zh-CN/thunderbird/

Remote Developer Tools Server38版本已经内部集成,可直接通过 工具 允许远程调试开启
火狐通过菜单 中 开发者 连接 默认是 6000端口



2.vs C++调试工程:

源码路径 : ExMail/Projects/vs/ExMail.sln






C++相关日志


typedef enum PRLogModuleLevel {
     PR_LOG_NONE = 0,                /* nothing */
     PR_LOG_ALWAYS = 1,              /* always printed */
     PR_LOG_ERROR = 2,               /* error messages */
     PR_LOG_WARNING = 3,             /* warning messages */
     PR_LOG_DEBUG = 4,               /* debug messages */

     PR_LOG_NOTICE = PR_LOG_DEBUG,   /* notice messages */
     PR_LOG_WARN = PR_LOG_WARNING,   /* warning messages */
     PR_LOG_MIN = PR_LOG_DEBUG,      /* minimal debugging messages */
     PR_LOG_MAX = PR_LOG_DEBUG       /* maximal debugging messages */
} PRLogModuleLevel;

PR_LOG(IMAP, PR_LOG_DEBUG, ("nsImapServerResponseParser::msg_fetch UID:%d fSavedFlagInfo:%lx\n", CurrentResponseUID(), fSavedFlagInfo));


回复

使用道具 举报

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
沙发
 楼主| 发表于 2015-11-5 12:40:35 | 只看该作者

1.js日志 从错误控制台输出日志(也可从命令行看到对应的输出)a.方法1:
D:\svn\code\thunderbird17.0.8\mozilla\toolkit\mozapps\update\nsUpdateService.js
  LOG("CheckernLoad - number of updates available: " + updates.length);



b.方法2:

Log4Moz.getConfiguredLogger("mail.wizard");

* E.g., if the loggername is mail.wizard, then look for prefs
   *   mail.wizard.logging.console
   *   mail.wizard.logging.dump
   *
   * whose values can be empty: no logging of that type; or any of
   * 'Fatal', 'Error', 'Warn', 'Info', 'Config', 'Debug', 'Trace', 'All',
   * in which case the logging level for each appender will be set accordingly


可以在错误控制台上设置为-1 即输出相应日志

D:\svn\code\thunderbird17.0.8\mailnews\base\prefs\content\accountcreation\guessConfig.js
// init logging
  this._log = Log4Moz.getConfiguredLogger("mail.wizard");
  this._log.info("created host detector");


//js增加打印日志的方法

var ac = Components.classes["@mozilla.org/steel/application;1"]
          .getService(Components.interfaces.steelIApplication).console;
ac.log("====addressbook load begin====");  



/**
   * Create a logger and configure it with dump and console appenders as
   * specified by prefs based on the logger name.
   *
   * E.g., if the loggername is foo, then look for prefs
   *   foo.logging.console
   *   foo.logging.dump
   *
   * whose values can be empty: no logging of that type; or any of
   * 'Fatal', 'Error', 'Warn', 'Info', 'Config', 'Debug', 'Trace', 'All',
   * in which case the logging level for each appender will be set accordingly
   *
   * Parameters:
   *
   * @param loggername The name of the logger
   * @param level (optional) the level of the logger itself
   * @param consoleLevel (optional) the level of the console appender
   * @param dumpLevel (optional) the level of the dump appender
   *
   * As described above, well-named prefs override the last two parameters
   **/

  getConfiguredLogger: function(loggername, level, consoleLevel, dumpLevel) {








全局搜索
gloda.js
_initLogging: function gloda_ns_initLogging() {
glodaLog.level = Log4Moz.Level.ALL;  Warn
capp.level = Log4Moz.Level.ALL;   Warn


mailnews.database.global.logging.console;true
mailnews.database.global.logging.dump;true
mailnews.database.global.logging.net;true
扩展管理窗口日志
AddonManager.jsm
["LOG", "WARN", "ERROR"].forEach(function(aName) {
  this.__defineGetter__(aName, function() {
    Components.utils.import("resource://gre/modules/AddonLogging.jsm");


    LogManager.getLogger("addons.manager", this);
    return this[aName];
  });
}, this);

AddonLogging.jsm
const FILE_EXTENSIONS_LOG             = "extensions.log";
const PREF_LOGGING_ENABLED            = "extensions.logging.enabled";




回复 支持 反对

使用道具 举报

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
板凳
 楼主| 发表于 2015-11-5 12:41:35 | 只看该作者
js日志输出到文件

1. 创建一个共用的js文件,如thinkmaillog.js,把如下内容复制进来
var gThinkmailLog = null;
function initThinkmailLog() {
    Components.utils.import("resource:///modules/gloda/log4moz.js");

    // 这里的字符串标识随便指定
    gThinkmailLog = Log4Moz.repository.getLogger("ThinkMailLog");
    gThinkmailLog.level = Log4Moz.Level["All"];

    // 在appdata下创建日志文件
    var logFile = FileUtils.getFile("ProfD", ["thinkmaillog.txt"]);

    // 如果指定其他路径,可以这样创建一个文件对象
    //var logFile = Components.classes["@mozilla.org/file/local;1"]
    //    .createInstance(Components.interfaces.nsILocalFile);
    //logFile.initWithPath("D:\\mozlog.txt");

    gThinkmailLog.addAppender(new Log4Moz.FileAppender(logFile, new Log4Moz.BasicFormatter()));
}

initThinkmailLog();

2. 在其他需要的地方引入这个js,然后打印日志:
gThinkmailLog.error("Something bad happened!");
gThinkmailLog.debug("Debug messages");
gThinkmailLog.info("Normal information");
此外还支持 fatal, warn, config, trace,一共7种日志类型。

3. 查看日志文件,格式如下:
2014-07-14 18:18:21    ThinkMailLog    ERROR    Something bad happened!
2014-07-14 18:18:21    ThinkMailLog    DEBUG    Debug messages
2014-07-14 18:18:21    ThinkMailLog    INFO    Normal information

Components.utils.import("resource:///modules/FileUtils.jsm");


回复 支持 反对

使用道具 举报

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
地板
 楼主| 发表于 2015-11-5 19:10:52 | 只看该作者
  1. let keys = Object.keys(items[0]);
  2.     console.log("First Gloda query completed " + items.length + ' with:' + JSON.stringify(keys));
  3.     console.log(items[0].conversationID)
复制代码
回复 支持 反对

使用道具 举报

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
5#
 楼主| 发表于 2016-2-16 16:08:56 | 只看该作者
  1. set NSPR_LOG_MODULES=smtp:5,imap:5,pop3:5,timestamp,sync
  2. set NSPR_LOG_FILE=firemail.log
复制代码
回复 支持 反对

使用道具 举报

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
6#
 楼主| 发表于 2016-2-18 17:27:53 | 只看该作者
let ac = Cc['@mozilla.org/steel/application;1'].getService(Ci.steelIApplication).console
回复 支持 反对

使用道具 举报

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
7#
 楼主| 发表于 2016-3-26 18:30:33 | 只看该作者
https://developer.mozilla.org/en ... ugging/HTTP_logging
  1. https://wiki.mozilla.org/MailNews:Logging
复制代码
file文件日志,主要是设置两个环境变量,可以在vs2010,工程->属性->环境 中添加NSPR_LOG_MODULES,与NSPR_LOG_FILE变量
e.g:
NSPR_LOG_MODULES=timestamp,nsHttp:5,nsSocketTransport:5,nsHostResolver:5
NSPR_LOG_FILE=%TEMP%\http.log // 确保你对该目录有读写权限

一、NSPR_LOG_MODULES值解析
1.NSPR_LOG_MODULES=模块名:level;其中模块名是各个模块自己定义的。

2.输出级别,推荐是5
PR_LOG_NONE = 0, /* nothing */
PR_LOG_ALWAYS = 1, /* always printed */
PR_LOG_ERROR = 2, /* error messages */
PR_LOG_WARNING = 3, /* warning messages */
PR_LOG_DEBUG = 4, /* debug messages */
5 (recommended)

3.NSPR_LOG_MODULES中除了模块定义以及deug_level外,还有两个比较独立的值:
sync:表示写log时不经过缓存,直接写到文件中。
timestamp:打log时前面的时间戳.

二、NSPR_LOG_FILE解析
指定log文件的全路径

三、源码实现
thunderbird日志主要是由nspr模块来实现。(见prlog.h)
每个模块都有一个PRLogModuleInfo类型的变量表示本模块的日志名称和级别,并通过PR_NewLogModule函数(实现在prlog.c)为其赋初值.
PR_LOG(NNTP,PR_LOG_ALWAYS,("(%p) ClosingSocket()",this));
IMPORTLOGMODULE = PR_NewLogModule("IMPORT");
目前这些模块名称没有使用集中到一个文件来统一管理。

打印log的批处理中,如果NSPR_LOG_MODULES指定了append模式,最好把timestamp也加上,不然难以分辨是哪次运行的。NSPR_LOG_MODULES支持的模式有sync(使用无缓冲API来写文件),bufsize(缓冲大小,默认512/行),timestamp(时间戳),append(追加模式),还有各个模块:级别,如果是全部模块则是all,使用逗号分隔。如:

set NSPR_LOG_MODULES=all:5,timestamp,append,sync
set NSPR_LOG_FILE=mylog.log
thunderbird.exe

一般NSPR_LOG_MODULES不需要带参数
set NSPR_LOG_MODULES=all:5

更多信息参见prlog.c  _PR_InitLog函数

根据时间来生产log文件,保存为*.bat文件,放在firmail.exe同级目录
  1. @echo off
  2. set MYLOG_DIR=log
  3. set curdir="%~dp0"
  4. set logdir="%curdir%""%MYLOG_DIR%"
  5. set dataandtime=%date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2%%time:~6,2%%time:~9,2%
  6. set logfilename=.\%MYLOG_DIR%\%dataandtime%.log
  7. set NSPR_LOG_MODULES=all:5
  8. set NSPR_LOG_FILE=%logfilename%
  9. if not exist %logdir% (
  10. md %logdir%
  11. ) else (
  12. echo 目录准备就绪.
  13. )
  14. if not exist %logdir% (
  15. echo 不能创建./log目录.
  16. pause
  17. ) else (
  18. start .\firemail.exe
  19. )
  20. exit
复制代码


https://wiki.mozilla.org/MailNews: Logging
Please enable Thunderbird to write extra information to a log file, by setting two environment variables before running a MailNews application.

Main module options within MailNews
MailNews applications (SeaMonkey/Thunderbird) allow these modules/protocols in both debug and release builds:
imap
ImapAutoSync
ldap
mime
msgdb (level 1=opens/closes, level 5 lists open db's on close, number of msg hdrs in use)  MSGDB 对应 nsMsgDatabase.cpp
nntp
pop3
smtp
IMPORT  //通讯录导入
MimeHtmlEmitter  nsMimeHtmlEmitter.cpp
ParseMailbox  nsParseMailbox.cpp

nsRDFService  nsRDFService.cpp

HelperAppService  nsExternalHelperAppService.cpp

MsgBiff   //检测服务端和客户端邮件的变化,以进行同步。MsgPurgeLogModule = PR_NewLogModule("MsgPurge");  //定期整理(压缩服务)

bool DebugOut()
{
        nsresult rv;
        nsCOMPtr<nsIPrefBranch> pref = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv);
        if (NS_FAILED(rv))
                return false;

        bool bDebug = false;
        pref->GetBoolPref("debug.info.out", &bDebug);
        return bDebug;
}

OutputDebugString








回复 支持 反对

使用道具 举报

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
8#
 楼主| 发表于 2016-4-9 16:16:43 | 只看该作者
pref("conversations.logging_enabled", true);
回复 支持 反对

使用道具 举报

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
9#
 楼主| 发表于 2016-4-15 13:05:25 | 只看该作者
-enable-debugger

14ee879cfe72aaeea578bdbcbe8a4d69c175298f

-remote-debugger

set GECKO_DEBUGERR_TYPE=local

::set GECKO_DEBUGERR_TYPE=remote-wait


1、环境变量,环境变量有以下这些

GECKO_DEBUGERR_TYPE: 其值有四种

空表示禁止调试

wait表示等待远程调试

local表示只接收本地调试连接

remote表示接收远程调试连接

这四个可以任意组合,用 - 连接,如下所示

::set "GECKO_DEBUGERR_TYPE="
::set GECKO_DEBUGERR_TYPE=wait
::set GECKO_DEBUGERR_TYPE=local
::set GECKO_DEBUGERR_TYPE=remote-wait

2、命令行参数

-app-code app-path
   app-path 用于手动自定application 目录

回复 支持 反对

使用道具 举报

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
10#
 楼主| 发表于 2016-4-20 23:33:03 | 只看该作者
中文等相关字符串的日志输出方法  目前输出有乱码
  //      nsCString receivedstr;
  //  LossyCopyUTF16toASCII(aValue, receivedstr);
// PR_LOG(gMsgDBViewLog, PR_LOG_ALWAYS,("subject: (%s)"),receivedstr.get());
     //  MessageBoxW(NULL,  aValue.BeginReading(),L"received",  MB_OK | MB_ICONERROR);

     nsCString receivedstr;
    LossyCopyUTF16toASCII(aValue, receivedstr);
  PR_LOG(gMsgDBViewLog, PR_LOG_ALWAYS,("received: (%s)"),receivedstr.get());


  #ifdef PR_LOGGING  
//   MessageBoxW(NULL, aValue.BeginReading(), L"date",  MB_OK | MB_ICONERROR);

    nsCAutoString datestr;

    LossyCopyUTF16toASCII(aValue, datestr);
    //MessageBox(NULL,  L"date", datestr.get(), MB_OK | MB_ICONERROR);
  PR_LOG(gMsgDBViewLog, PR_LOG_ALWAYS,("date: (%s)"),datestr.get());
#endif
nsCString RFC2;
  RFC2.AppendInt(numHdrs);
  nsAutoString Rf2;
  CopyMUTF7toUTF16(RFC2,Rf2);
  //MessageBoxW(NULL,Rf2.get(), L"R2", MB_OK | MB_ICONERROR);
#ifdef PR_LOGGING  
  char *flags2 = nullptr;
  flags2 = (char *) PR_Calloc(1, lineLength+2);
  PL_strncpy(flags2, line,lineLength);
  nsCString RFC2(flags2);
  nsAutoString Rf2;
  CopyMUTF7toUTF16(RFC2,Rf2);
  //MessageBoxW(NULL, L"HandleLine", L"R2", MB_OK | MB_ICONERROR);
  //MessageBoxW(NULL, Rf2.get(), L"R2", MB_OK | MB_ICONERROR);

#endif
#ifdef PR_LOGGING  
  char *flags2 = nullptr;
  flags2 = (char *) PR_Calloc(1, lineLength+2);
  PL_strncpy(flags2, line,lineLength);
  nsCString RFC2(flags2);
  nsAutoString Rf2;
  CopyMUTF7toUTF16(RFC2,Rf2);
  //MessageBoxW(NULL, L"ParseFolderLine", L"R2", MB_OK | MB_ICONERROR);
  MessageBoxW(NULL, Rf2.get(), L"R2", MB_OK | MB_ICONERROR);

#endif
#ifdef PR_LOGGING  
PR_LOG(gParseMailboxLog, PR_LOG_ALWAYS,("11 time1:%u rcvTimeSecs:%u",m_receivedTime,rcvTimeSecs));
PRTime resultTime;
          PRStatus timeStatus = PR_ParseTimeString (date->value, false, &resultTime);
          if (PR_SUCCESS == timeStatus)
          {
            PR_LOG(gParseMailboxLog, PR_LOG_ALWAYS,("11 time2:%u",resultTime));
          }
#endif
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-4-19 17:24 , Processed in 0.070738 second(s), 18 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表