导航:首页 > 源码编译 > 编译器输出日志文件

编译器输出日志文件

发布时间:2022-11-26 19:19:04

⑴ wince6.0启动异砦新手求助

Windows CE6.0启动过程分析
在Windows CE 6.0中,内核(Kenerl)和OEM代码被分成oal.exe、kernel.dll和kitl.dll三个部分,其中启动代码(startup)和 OAL层的实现部分不再与内核链接生成NK.exe,取而代之的是启动代码(startup)和硬件相关且独立于内核的OAL层的实现部分编译成 oal.exe,而与内核相关且独立于硬件的OAL层代码包含在kernel.dll中;内核无关传输层(KITL)的支持代码从OAL层分离出来编译成 kitl.dll。
从表面上看,好像只是代码重新组合了一下,从帮助 文档中BSP的移植过程看好像也是这么一回事,实际上,整个Windows CE 6.0内核布局发生了很大的改变。Windows CE 6.0的启动过程也是如此,如果你想按照Windows CE 5.0的启动顺序去分析Windows CE 6.0的启动顺序,可能会走到一个死胡同。主要是因为Windows CE 6.0在启动过程中调用了kernel.dll和kitl.dll两个动态链接库的原因,而且Windows CE6.0不再编译生成KernKitlProf.exe内核文件。
从Windows CE 6.0的帮助文档可以看出,WinCE6.0的启动只与oal.exe和kernel.dll有关,至于kitl.dll,只有将操作系统编译成具有 KITL功能时才用到。分析Windows CE 6.0的启动过程实际上找到编译oal.exe和kernel.dll的源码位置。
首先看一下将WinCE6.0编译成诸如 WinCE5.0所说的基本内核情况,即kern.exe。对于oal.exe源码位置比较容易找到,因为oal.exe是启动代码与硬件相关的OAL层 实现文件编译而成,所以只需在BSP的OAL目录中便能找到。而对于kernel.dll,在BSP目录结构中,基本上无法找到kernel.dll的编 译文件,所以必须从其他方面着手。
下面为WinCE 6.0的编译日志输出文件:makeimg.out在文件复制过程的一部分:
Copying E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\oal.exe to E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\nk.exe for debugger Copying E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kern.dll to E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kernel.dll for debugger
从日志输出文件可以看出,在文件复制过程 中,WinCE6.0编译器将oal.exe更名为nk.exe,而将kern.dll文件更名为kernel.dll,也就是说,kern.dll文件 的实现部分就是kernel.dll的实现体。根据前面的分析,oal.exe是与硬件相关独立于内核的OAL层的实现部分,而kernel.dll为内 核相关独立于硬件的OAL层的实现部分。同样可以从最后整合后的二进制配置文件ce.bib文件中看出端倪。
; @CESYSGEN IF CE_MODULES_NK
nk.exe E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\oal.exe NK SHZ
kitl.dll E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kitl.dll NK SHZ
kernel.dll E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kern.dll NK SHZ
; @CESYSGEN ENDIF
而kern.dll动态库在整个Windows CE6.0中没有显式编译过程,即没有一个sources文件有kern.dll的编译过程,所以只能从操作系统的编译文件Makefile中寻找其编译 过程。下面看一下$(_PUBLICROOT)\common\CESYSGEN\makefile中的部分内容:
nk::$(NK_COMPONENTS) $(NK_REPLACE_COMPONENTS)
@ $(SG_INPUT_LIB)\oemstub.pdb $(SG_OUTPUT_OAKLIB)
@ $(SG_INPUT_LIB)\oemstub.lib $(SG_OUTPUT_OAKLIB)
set TARGETTYPE=DYNLINK
set TARGETNAME=kern
set RELEASETYPE=OAK
set DLLENTRY=NKStartup
set DEFFILE=NO_DEF_FILE
set TARGETLIBS=
set SOURCELIBS=%%NKLIBS%% $(SG_INPUT_LIB)\nkmain.lib $(SG_INPUT_LIB)\fulllibc.lib
$(MAKECMD) /NOLOGO NOLIBC=1 kern.dll
从上述代码中可以发现,原来kern.dll动态库是从oemstub.lib编译而来,而且与nkmain.lib有关。
在理顺了上述文件的相互之间的关系之后,再来分析Windows CE 6.0的启动过程可能就比较容易啦。
在理清了上述文件的关系之后,便可以分析任意一款基于ARM微处理器的Windows CE 6.0的启动过程,现在以深圳亿道电子技术有限公司开发的基于PXA270 ARM开发平台为例,分析Windows CE 6.0操作系统启动过程。
1、Startup函数:
从Windows CE 6.0的帮助文档可以看出,WinCE6.0的启动只与oal.exe和kernel.dll有关,至于kitl.dll,只有将操作系统编译成具有 KITL功能时才用到。分析Windows CE 6.0的启动过程实际上找到编译oal.exe和kernel.dll的源码位置。
oal.exe的通过Startup函数完成硬件 的初始化。Startup.s代码与该硬件平台的Bootloader启动代码共用,其中PreInit函数主要完成将ARM处理器工作模式切换到管理员 模式、同时关闭MMU,并检测系统启动原因,如果是热启动、即在该函数调用之前已经启动了Bootloader程序,相当基本硬件初始化已经完成,则直接 跳转到OALStartUp函数中;否则需要进行硬件中断屏蔽、内存、系统时钟频率、电源管理等硬件的基本初始化过程。(具体过程见代码的分析)

⑵ 我在dos下使用devenv.exe编译MFC解决方案sln程序时,生成的日志文件提示生成cmd.exe时出错,

可以更详细一点吗?
那个不叫Dos,叫控制台窗口。

⑶ 如何把数据写入日志里(python

#coding=utf-8
def
initlog():
import
logging
#
生成一个日志对象
logger
=
logging.getLogger()
#
生成一个Handler。logging支持许多Handler,
#
象FileHandler,
SocketHandler,
SMTPHandler等,我由于要写
#
文件就使用了FileHandler。
#
logfile是一个全局变量,它就是一个文件名,如:'crawl.log'
logfile
=
'test.log'
hdlr
=
logging.FileHandler(logfile)
#
成一个格式器,用于规范日志的输出格式。如果没有这行代码,那么缺省的
#
格式就是:"%(message)s"。也就是写日志时,信息是什么日志中就是什么,
#
没有日期,没有信息级别等信息。logging支持许多种替换值,详细请看
#
Formatter的文档说明。这里有三项:时间,信息级别,日志信息
formatter
=
logging.Formatter('%(asctime)s
%(levelname)s
%(message)s')
#
将格式器设置到处理器上
hdlr.setFormatter(formatter)
#
将处理器加到日志对象上
logger.addHandler(hdlr)
#
设置日志信息输出的级别。logging提供多种级别的日志信息,如:NOTSET,
#
DEBUG,
INFO,
WARNING,
ERROR,
CRITICAL等。每个级别都对应一个数值。
#
如果不执行此句,缺省为30(WARNING)。可以执行:logging.getLevelName
#
(logger.getEffectiveLevel())来查看缺省的日志级别。日志对象对于不同
#
的级别信息提供不同的函数进行输出,如:info(),
error(),
debug()等。当
#
写入日志时,小于指定级别的信息将被忽略。因此为了输出想要的日志级别一定
#
要设置好此参数。这里我设为NOTSET(值为0),也就是想输出所有信息
logger.setLevel(logging.NOTSET)
return
logger
logging=initlog()
logging.info(u'注册')

⑷ Windows下怎么获取并保存g++的编译日志

g++ 编译参数 > 日志文件.log

⑸ openwrt编译之后,编译过程生成的log文件在哪个目录下

编译后生成一个EXE啊,还有一些像OBJ格式的文件,那些都是中间文件,真正用的到的就是那个EXE文件

⑹ 请问用visual studio编译solution工程文件的时候,会产生编译时的日志吗放在哪里

当然有了
visual studio6.0 在工程目录里会产生一个.plg文件
visual studio2005和2005会在Debug或Release目录里产生一个.htm文件

⑺ 我写了个VB6.0的程序,我想用VB调用G++编译程序并输出日志文件,可是一直不行怎么办

看着有点晕,建议你把完整的字符串赋值给一个变量,然后MsgBox看一下有没问题,
或者复制出来,在dos窗口里手工运行看下先,

linux编译的时候怎么保存日志啊,就比如g++ test.cpp,怎么编译完了查看日志


g++ test.cpp > log

然后就会在编译的目录下多出一个log文件,你用文本编辑器打开就可以看了

⑼ 如何实现log4cxx日志输出方式

Log4cxx是开放源代码项目Apache Logging Service的子项目之一,用于为C++程序提供日志功能,以便开发者对目标程序进行调试
和审计。本文对log4cxx的使用及配置进行介绍,并给出一个可以快速开始的实例。最后,针对日志服务给出一些实践方面的建议。
1. 介绍
Log4cxx是开放源代码项目Apache Logging Service的子项目之一,是Java社区着名的log4j的c++移植版,用于为C++程序提供日志
功能,以便开发者对目标程序进行调试和审计。
有关log4cxx的更多信息可以从Apache Loggin Service的网站http://logging.apache.org获得。当前的稳定版本为0.9.7,本文内
容及示例代码都是基于此版本。此外,示例代码的编译环境为Windows环境中的Microsoft Visual C++ .Net 2003。
本文的示例代码可以在此下载,其中也包含了预编译好的log4cxx的库文件。
2. 集成log4cxx到IDE
要使用log4cxx,首先需要将其集成到你的项目开发环境中。以下针对Windows环境中的Microsoft Visual C++ .Net 2003进行说明
,其他环境的配置信息请参考官方文档。
要让log4cxx为你工作,通常情况下需要如下几个步骤:
l 获取软件包:得到log4xx的源代码;
l 编译:构建库文件;
l 项目环境设置:加入log4cxx支持。
2.1 获取软件包
请从官方网站获得合适的版本。也可以从下面这个链接中直接获取(直接的链接地址可能不会永远有效):
http://mirror.vmmatrix.net/apache/logging/log4cxx/log4cxx-0.9.7.tar.gz
下载完成后解压缩到合适的目录中,因为我们在下一步中需要使用软件包,包括编译和复制必要的文件。
2.2 编译
原始发行包中不含编译后的代码,这个工作需要我们自己来做。打开你的IDE,并加载以下目录中的工程:
l Msvc\static:该工程产生log4cxx的静态链接库(lib4cxx.lib和lib4cxxs.lib);
l Msvc\dll:该工程产生log4cxx的动态链接库(lib4cxx.dll)。
通常情况下,工程都可以顺利编译通过。查看输出目录,把这些生成的库文件找出来,以便在下一步骤中使用。
2.3 项目环境设置
请先在IDE中打开一个需要加入日志功能的工程,或者出于实验目的,新建一个工程,以便对其进行设置。
首先需要设置log4cxx的include文件。这些文件位于log4cxx软件包的include\log4cxx目录内。请查看你的VC++ IDE中“工具->选
项->项目->VC++目录->包含文件”所列出的内容,以便确定你以何种方式加入这些include文件:
l 将include\log4cxx直接拷贝到已定义的包含文件目录中。如果将log4cxx看作是一项系统服务的话,这样做是胡合乎情理
的,因为你可以采用标准库的方式使用它,例如:#include <log4cxx/logger.h>
l 增加一个包含路径,以指向位于IDE外部的某一文件目录。可以简单的指向在2.1中解压缩后形成的log4cxx软件包目录。
下一步需要对2.2节产生的log4cxx库进行设置。这取决于你使用该库的方式:静态链接或者动态链接。
l 静态链接情况下需要做如下工作:为预编译器定义LOG4CXX_STATIC宏,设置位置为“项目->属性->配置属性->C/C++->预
处理器->预处理器定义”;为链接器指定依赖的库lib4cxxs.lib和Ws2_32.lib,设置位置为“项目->属性->配置属性->链接器->输
入->附加依赖项”。
l 动态链接情况下只需要为链接器指定依赖的库lib4cxxs.lib即可,设置方式同上。

3. 示例代码
本节展示了一个最简单的log4cxx示例,以便你可以快速的了解它。
该示例在功能上创建了一个日志服务,该日志可通过配置文件进行必要控制,并可以同时向文件和控制台输出信息。
在实现上,我们采用了一个简单的控制台程序,并使用动态链接库的方式使用log4cxx。
要实现这个目标,请按如下步骤进行:
1)创建一个名为logdemo的空白win32控制台工程,并按照2.3节所述内容对其进行设置。注意,这里我们使用动态连接口的方式。
2)在logdemo.cpp中加入实现日志功能的代码。完成后的代码清单如下:
#include "stdafx.h"
#include <log4cxx/logger.h>
#include <log4cxx/propertyconfigurator.h>

using namespace log4cxx;

int _tmain(int argc, _TCHAR* argv[])
{
//加载log4cxx的配置文件,这里使用了属性文件
PropertyConfigurator::configure("log4cxx.properties");

//获得一个Logger,这里使用了RootLogger
LoggerPtr rootLogger = Logger::getRootLogger();

//发出INFO级别的输出请求
LOG4CXX_INFO(rootLogger, _T("它的确工作了"));
//rootLogger->info(_T("它的确工作了")); //与上面那句话功能相当

return 0;
}

以Debug方式编译工程,调试程序直到成功为止。
3)新建一个文本文件,命名为log4cxx.properties,并键入如下内容:
# 设置root logger为DEBUG级别,使用了ca和fa两个Appender
log4j.rootLogger=DEBUG, ca, fa

4)复制log4cxx.dll到输出目录。在动态链接方式下,应用程序需要能够找到这个库文件。
5)运行生成的logdemo.exe文件,查看一下运行结果,看看我们工作有没有取得成效。如果一切顺利,无论是在控制台还是在输出
文件中,都应该能看到类似下面那样的输出内容:
2006-06-02 16:09:50,609 [2528] INFO root - 它的确工作了

4. 体系结构
4.1 核心类
Log4cxx有三个关键组件,它们是loggers, appenders和layouts。
Logger是log4cxx的核心类,只要执行日志操作;looger有层次结构,最顶层为RootLogger;logger是有级别的。每个logger可以附
加多个Appender。Appender代表了日志输出的目标,如输出到文件、控制台等等。对于每一种appender,都可以通过layout进行格
式设置。
这三类组件用示意图表示如下(不代表类关系):
(TODO:在此对三种组件分别进行说明)
4.2 配置类
此外在使用中还会用到的类有BasicConfigurator、PropertyConfigurator和DOMConfigurator等,用于对log4cxx进行配置。其中:
BasicConfigurator提供了一种简单配置,包括使用ConsoleAppder作为root appender和PatternLayout作为缺省布局。
PropertyConfigurator使用properties文件作为配置方式。
DOMConfigurator则使用properties文件作为配置方式。
(TODO:在此对配置内容进行说明)
5. 实践指导
在项目中是否使用日志,以及如何使用日志,对开发者来说都是一个需要做出的技术选择,这通常会牵扯到系统的性能,使用日志
的目的等问题。我们使用日志的方式,有些是这个行业积累了多年的经验,有些则纯粹关乎个人的喜好。
1)何时使用日志
通常情况下,日志的作用在于调试和审计,如果你的项目对此有特殊需求,即可考虑使用日志。
对于调试,通常用于IDE调试器无法达到的地方。一些常见的场景包括:
分布式组件的调试。在服务器端的组件,需要通过客户端的调用来验证其工作是否正确,此时利用日志的输出作为辅助工具对错误
进行诊断。
链接库调试。在无法跟踪进外部库中的情况下,这种方法非常有效。
生产环境下的调试。生产环境通常是指产品在客户处处于正式运行的状态,在出现问题时,开发者常常不在现场,借助日志的输出
进行错误判断就是一个非常有效的手段。
对于审计应用,则需要视特定的情况而定,程序级的记录能力,无疑可以作为业务级审计手段的有效补充。
无论是在哪种场景下,log4cxx都是可以胜任工作的,这取决于它的灵活的配置能力及多种类型的输出方式。
2)性能问题
关闭日志,通过配置文件设置日志的关闭和打开
使用宏代替logger的输出命令
选择性输出日志。建立logger的层次结构,根据级别选择性输出
输出目标。尽可能减少输出目标
选择合适的输出格式。使用SimpleLayout将达到与std::cout相当的速度。
3)其它
使用类的全限定名对logger命名
6. 结论
Log4cxx具有的一些显着特性使得C++者可以将其放入自己的工具箱中,这些特性包括灵活的配置能力,多种输出手段,丰富的格式
控制,出色的性能。如果在你的开发中需要借助于日志进行调试和审计,你也许需要log4cxx。最后,重要的一点是,如你所见,
log4cxx的使用是如此的简单。

阅读全文

与编译器输出日志文件相关的资料

热点内容
国产系统怎么解压 浏览:552
战双程序员 浏览:483
him触摸编程软件 浏览:931
植物大战僵尸存档怎么转移安卓 浏览:852
java栈的元素 浏览:737
程序员与篮球事件 浏览:675
app反编译不完整 浏览:788
电脑上的文件夹怎么调整 浏览:7
服务器无响应是什么原因呀 浏览:984
wd文档里的app怎么制作 浏览:513
电脑里的文件夹没有了一般能恢复吗 浏览:418
哪里有配加密钥匙的 浏览:210
服务器开不了机怎么把数据弄出来 浏览:958
gif动态图片怎么压缩 浏览:521
黑猴子棒球压缩文件解压密码 浏览:631
如何让app适应不同的手机屏幕大小 浏览:10
苹果手机如何给安卓手机分享软件 浏览:761
苹果电脑怎么运行腾讯云服务器 浏览:59
明日之后沙石堡命令助手 浏览:261
蛋糕店用什么样的app 浏览:877