NPAPI插件开发详细记录:插件的调试

时间:2022-01-29 17:46:17
这里归纳一下我知道的在插件开发中使用的几种调试手段。

附加到进程

之前也提及过关于插件的调试,这里需要补充一点关于在chrome中调试插件的内容,在chrome中运行插件时,插件的进程也是chrome.exe,因此要准确的找到正确的插件进程可以为chrome添加启动参数--plugin-startup-dialog,如图:

NPAPI插件开发详细记录:插件的调试

当chrome加载插件时,就会弹出对话框:

NPAPI插件开发详细记录:插件的调试

如果用其他浏览器进行调试,也只需要找到加载插件的进程就可以了,这种方法的具体步骤请参考: 插件调试

弹出对话框


       由于插件是一个dll,无法直接跟踪代码,除了前述方式之外,我们采用的较多的方式是弹出消息框的方式,这与一般的程序使用printf输出调试信息是类似的,不过这种方式只适合在较少的位置添加,消息框太多会导致调试过程更加难受的。

       一般开发windows上的插件都会包含windows.h和tchar.h等几个头文件,因此在插件中一般只需要直接调用MessageBox,较常用的方式是:MessageBox(NUL,_T(“THE MSG TO SHOW”),_T(“TITLE”),0);

        这种方式不好,但当你的插件加载时就崩溃了的话,根本无法采用附加到进程的方式来调试插件,此时可以在几个关键位置添加消息框来定位bug。
在windows平台还有一种方式可以替代弹消息框,那就是利用OutputDebugString。

利用OutputDebugString输出调试信息


        在WinBase.h中定义了OutputDebugString,在代码中添加OutputDebugString(_T(“THE MSG TO OUTPUT”));在插件运行的过程中,如果执行到这些代码,即可利用Dbgview.exe(需要的请自行在网上搜索下载)来查看输出的信息。
        为了方便使用,可以在头文件中添加调用OutputDebugString的代码,举例来说,我可以在npfrmwk.h中添加如下代码:

void inline NP_OUTPUT_DBG_STRING(string str)
{
#if defined(XP_WIN) && defined(_DEBUG)
	OutputDebugString(str.c_str());
#endif
}
       注意,这里使用了inline,如果不使用inline,则需要在头文件中添加函数声明,在cpp文件中加以实现。建议设计为inline方式。
       还可以进一步对该函数进行重载以支持更多参数和参数类型,当然还可以参考printf,做成可以格式化输出的形式,具体可以在网上搜索,我用模板实现了一个接收单一参数的函数:
template <typename T>
void NP_OUTPUT_DBG_STRING(T t)
{
#ifdef _DEBUG
	std::stringstream ss;
	ss<<t;
	NP_OUTPUT_DBG_STRING(ss.str());
#endif
}
       这样则可以接收任何基本数据类型和具有<<操作符的复杂操作类型,我没有去实现接受多个参数的形式,因为在使用的时候可以多次调用来输出多个调试信息。由于使用了#ifdef _DEBUG预编译指令,因此只有在debug版才会输出信息,release版就不会进行输出了。