1.Linux下/proc目录介绍
2.盘一盘Linux内核中ns级别的源码高精度计时方法
3.Android NDK Tombstone/Crash 分析
4.linux printå½ä»¤
5.linux32ä½å64ä½çåºå«
Linux下/proc目录介绍
Linux下的/proc目录是内核提供的一种机制,用于在运行时访问内核内部数据结构和改变内核设置。源码它是源码一个伪文件系统,以文件系统的源码方式为访问系统内核数据的操作提供接口。用户和应用程序通过/proc可以获取系统信息,源码并能修改内核参数。源码大神spring源码系统的源码信息,如进程,源码是源码动态改变的,因此用户读取/proc文件时,源码是源码动态从系统内核读出所需信息并提交的。
在/proc目录中,源码存在多个子文件或子文件夹,源码如/sys、源码net、源码scsi和sys。特别地,sys目录是可写的,用于访问或修改内核参数;net和scsi则依赖于内核配置。对于进程信息,/proc目录下存在数字命名的PHP退货记录源码目录,代表系统中当前运行的每一个进程,例如进程PID号的目录;self目录则是读取进程本身信息的接口。
以下是部分/proc目录中具体文件或子目录的介绍:
- /proc/buddyinfo:与内存区中的每个order的可用块数量和内存碎片相关。
- /proc/cmdline:启动时传递给kernel的参数信息。
- /proc/cpuinfo:CPU信息。
- /proc/crypto:内核使用的所有已安装加密密码及细节。
- /proc/devices:已加载设备并分类。
- /proc/dma:已注册使用的ISA DMA频道列表。
- /proc/execdomains:支持的execution domains信息。
- /proc/fb:帧缓冲设备列表,包括数量和控制它的驱动。
- /proc/filesystems:内核当前支持的文件系统类型。
- /proc/interrupts:x架构中的每个IRQ中断数。
- /proc/iomem:每个物理设备在系统内存中的映射。
- /proc/ioports:一个设备的输入输出所使用的注册端口范围。
- /proc/kcore:代表系统的物理内存,存储为核心文件格式。
- /proc/kmsg:记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg处理。
- /proc/loadavg:根据过去一段时间内CPU和IO状态得出的开奖网站源码分享负载状态,与uptime命令相关。
- /proc/locks:内核锁住的文件列表。
- /proc/mdstat:多硬盘、RAID配置信息。
- /proc/meminfo:RAM使用相关信息。
- /proc/misc:其他主要设备(设备号为)上注册的驱动。
- /proc/modules:所有加载到内核的模块列表。
- /proc/mounts:系统中使用的所有挂载。
- /proc/mtrr:系统使用的Memory Type Range Registers(MTRRs)。
- /proc/partitions:分区中的块分配信息。
- /proc/pci:系统中的PCI设备列表。
- /proc/slabinfo:系统中所有活动的slab缓存信息。
- /proc/stat:所有CPU活动信息。
- /proc/sysrq-trigger:使用echo命令写入时,远程root用户可以执行关键系统请求命令。
- /proc/uptime:系统已经运行了多久。
- /proc/swaps:交换空间的使用情况。
- /proc/version:Linux内核版本和gcc版本。
在/proc目录中,还存在针对特定进程的小工在线源码信息目录,如 /proc/N,这里N代表进程ID。这些目录提供了关于特定进程的详细信息,如启动命令、当前工作目录、环境变量、执行命令文件、文件描述符、内存映射信息等。
举例来说,要查看/proc目录中的内容,可以使用`ls /proc/`命令。此外,/proc/sys目录包含了系统信息和内核参数,例如,要查看当前配置的文件句柄最大数,可以使用`cat /proc/sys/fs/file-max`命令。改变内核参数可以通过编辑或重定向到文件中完成,例如,使用`echo > /proc/sys/fs/file-max`来增加文件句柄的qtcreator导入源码目录最大数目。
盘一盘Linux内核中ns级别的高精度计时方法
在Linux内核中,尽管系统本身和中断的存在限制了其提供ns级别的高精度计时,常规内核高精度计时器只能勉强达到us级别且误差较大。因此,在需要ns级别精确计时的场景下,需要借助其他方法。以下介绍两种针对不同处理器平台的精确计时方式:x平台和ARM平台。
### x平台下的精确计时
从Pentium开始,x平台引入了时间戳计数器(TSC),这是一个用于记录自上电启动以来CPU执行周期数的位寄存器。在每个时钟信号到来时,TSC自动加一。若CPU主频为2GHz,每条指令执行时间为0.5ns。通过读取TSC的当前值,可以计算出代码执行的时间。具体操作是在代码段的A点和B点分别读取TSC,两值相减并乘以指令周期,即可得到A点和B点间代码执行的耗时。
### ARM平台下的精确计时
对于ARM平台,虽然没有直接提供类似TSC的寄存器,但通过定时计数器实现精确计时是可行的。定时器能够提供计数和计数比较功能,计数频率由系统时钟经过分频决定,且不受系统软件影响,可以实现较高的精度。以MHz计数频率为例,每秒计数次,转换为us级别,每计数一次为ns。通过驱动程序直接访问相关寄存器,可以实现精确的计时功能。
### ARM平台的计数器使用
在ARM架构的芯片上,定时器的使用涉及频率、控制、计数等关键寄存器。通过设置计数器频率控制器(CNTFRQ_EL0)和物理计数器控制寄存器(CNTP_CTL_EL0),可以启用计数器进行精确计时。计数器在使能后开始计数,即使被停止计数,仍会继续计数直到断电。驱动程序通过死循环轮询计数寄存器,可以验证计数器的精度,并实现精确的计时功能。
### 性能监控寄存器
ARM平台还提供性能监控寄存器(Performance Monitors registers),包括性能监控控制寄存器(PMCR_EL0)、计数使能寄存器(PMCNTENSET_EL0)和周期计数寄存器(PMCCNTR_EL0)。这些寄存器主要用于CPU性能监控,但同样提供了计数功能,可以用于精确计时。通过结合性能监控单元(PMU),可以实现高级的性能监控和计时。
通过上述方法,x和ARM平台在特定场景下能够实现ns级别的精确计时,为开发者提供了灵活的计时解决方案。
Android NDK Tombstone/Crash 分析
程序员在调试Bug的过程中,访问非法内存是最让人头疼的问题。调试程序Bug通常有三种方法:那么如何调试引发Crash的NDK程序呢?
幸运的是,Google早已预见到我们编写的NDK代码可能存在缺陷。当NDK程序发生Crash时,会在/data/tombstones/路径下生成记录Crash信息的文件tombstone_xx。同时,Google在NDK包中也提供了一系列调试工具,如addr2line、objdump、ndk-stack。
在介绍Tombstone之前,我们先补充一下Linux信号机制的相关知识。信号机制是Linux进程间通信的一种重要方式,用于正常的进程间通信和同步,以及监控系统异常及中断。当应用程序运行异常时,Linux内核会产生错误信号并通知当前进程。当前进程在接收到该错误信号后,可以有三种不同的处理方式。
当Linux应用程序在执行时发生严重错误,一般会导致程序crash。Linux专门提供了一类crash信号,程序接收到此类信号时,缺省操作是将crash的现场信息记录到core文件,然后终止进程。
什么是Tombstone?Android Native程序本质上就是一个Linux程序,当它在执行时发生严重错误,也会导致程序crash,然后产生一个记录crash的现场信息的文件,在Android系统中就是tombstone文件。
Tombstone文件位于路径/data/tombstones/下,它记录了死亡进程的基本信息、死亡的地址以及死亡时的现场信息。
分析出现Crash的原因和代码位置最重要的就是分析这个tombstone文件。tombstone文件主要由以下几部分组成:Build fingerprint、Crashed process and PIDs、Terminated signal and fault address、CPU registers、Call stack、Stack content of each call。
Crashed process and PIDs信息表示Crash掉进程的基本信息,包括进程号、线程号等。Terminated signal and fault address信息表示程序因为什么信号导致了Crash以及出现错误的地址。Call Stack信息记录了程序在Crash前的函数调用关系以及当前正在执行函数的信息。
在分析tombstone文件时,我们主要关注Crashed process and PIDs、Terminated signal and fault address和Call stack部分。
addr2line是NDK中用来获得指定动态链接库文件或者可执行文件中指定地址对应的源代码信息的工具。ndk-stack能自动分析tombstone文件,将崩溃时的调用内存地址和C++代码一行一行对应起来。
总结来说,Android NDK程序的系统调试并不复杂,只要掌握了正确的方法,了解Tombstone文件中关键信息的含义,学会使用addr2line和ndk_stack这两个超级方便的工具,就可以快速定位到导致NDK程序Crash的Bug。但具体的Bug还需要进一步根据业务逻辑来分析代码。
linux printå½ä»¤
å ·ä½åæ°å讲解å¦ä¸ï¼
printå½ä»¤çæ ¼å¼æ¯ï¼
print xxx
p xxx
1. print æä½ç¬¦
@
æ¯ä¸ä¸ªåæ°ç»æå ³çæä½ç¬¦ï¼å¨åé¢ä¼ææ´è¯¦ç»ç说æã
::
æå®ä¸ä¸ªå¨æ件ææ¯ä¸ä¸ªå½æ°ä¸çåéã
{ }
表示ä¸ä¸ªæåå åå°åçç±»å为typeçä¸ä¸ªå¯¹è±¡ã
2. å¯çå 容
å ¨å±åéï¼æææ件å¯è§çï¼
éæå ¨å±åéï¼å½åæ件å¯è§çï¼
å±é¨åéï¼å½åScopeå¯è§çï¼
å¦æä½ çå±é¨åéåå ¨å±åéåçå²çªï¼ä¹å°±æ¯éåï¼ï¼ä¸è¬æ åµä¸æ¯å±é¨åéä¼éèå ¨å±åéãå¦ææ¤æ¶ä½ æ³æ¥çå ¨å±åéçå¼æ¶ï¼ä½ å¯ä»¥ä½¿ç¨â::âæä½ç¬¦ï¼
file::variable
function::variable
eg:
æ¥çæ件f2.cä¸çå ¨å±åéxçå¼ï¼
gdb) p 'f2.c'::x
注ï¼å¦æä½ çç¨åºç¼è¯æ¶å¼å¯äºä¼åé项ï¼é£ä¹å¨ç¨GDBè°è¯è¢«ä¼åè¿çç¨åºæ¶ï¼å¯è½ä¼åçæäºåéä¸è½è®¿é®ï¼ææ¯åå¼é误ç çæ åµã对ä»è¿ç§æ åµæ¶ï¼éè¦å¨ç¼è¯ç¨åºæ¶å ³éç¼è¯ä¼åãGCCï¼ä½ å¯ä»¥ä½¿ç¨â-gstabsâ é项æ¥è§£å³è¿ä¸ªé®é¢ã
3. å¯çæ°ç»
(1)å¨ææ°ç»ï¼
p *array@len
array:æ°ç»çé¦å°åï¼len:æ°æ®çé¿åº¦
eg:
(gdb) p *array@len
$1 = { 2, 4, 6, 8, }
(2)éææ°ç»
å¯ä»¥ç´æ¥ç¨printæ°ç»åï¼å°±å¯ä»¥æ¾ç¤ºæ°ç»ä¸æææ°æ®çå 容äºã
4. è¾åºæ ¼å¼
x æåå è¿å¶æ ¼å¼æ¾ç¤ºåéã
d æåè¿å¶æ ¼å¼æ¾ç¤ºåéã
u æåå è¿å¶æ ¼å¼æ¾ç¤ºæ 符å·æ´åã
o æå «è¿å¶æ ¼å¼æ¾ç¤ºåéã
t æäºè¿å¶æ ¼å¼æ¾ç¤ºåéã
a æåå è¿å¶æ ¼å¼æ¾ç¤ºåéã
c æåç¬¦æ ¼å¼æ¾ç¤ºåéã
f ææµ®ç¹æ°æ ¼å¼æ¾ç¤ºåéã
eg:
(gdb) p i
$ =
(gdb) p/a i
$ = 0x
(gdb) p/c i
$ = 'e'
5. å¯çå å
使ç¨examineï¼ç®åxï¼æ¥æ¥çå åå°åä¸çå¼ãè¯æ³ï¼
x/
nãfãuæ¯å¯éçåæ°ã
ï¼1ï¼n æ¯ä¸ä¸ªæ£æ´æ°ï¼è¡¨ç¤ºæ¾ç¤ºå åçé¿åº¦ï¼ä¹å°±æ¯è¯´ä»å½åå°åååæ¾ç¤ºå 个å°åçå 容ã
ï¼2ï¼f 表示æ¾ç¤ºçæ ¼å¼ï¼åè§ä¸é¢ãå¦æå°åææçæ¯å符串ï¼é£ä¹æ ¼å¼å¯ä»¥æ¯sï¼å¦æå°åæ¯æ令å°åï¼é£ä¹æ ¼å¼å¯ä»¥æ¯iã
ï¼3ï¼u 表示ä»å½åå°åå¾å请æ±çåèæ°ï¼å¦æä¸æå®çè¯ï¼GDBé»è®¤æ¯4个bytesãuåæ°å¯ä»¥ç¨ä¸é¢çå符æ¥ä»£æ¿ï¼b表示ååèï¼h表示ååèï¼w表示åå èï¼gè¡¨ç¤ºå «åèãå½æ们æå®äºåèé¿åº¦åï¼GDBä¼ä»æå åå®çå åå°åå¼å§ï¼è¯»åæå®åèï¼å¹¶æå ¶å½ä½ä¸ä¸ªå¼ååºæ¥ã
eg:
x/3uh 0x ï¼ä»å åå°å0x读åå 容ï¼h表示以ååè为ä¸ä¸ªåä½ï¼3表示ä¸ä¸ªåä½ï¼u表示æåå è¿å¶æ¾ç¤ºã
6. å¯çå¯åå¨
ï¼1ï¼è¦æ¥çå¯åå¨çå¼ï¼å¾ç®åï¼å¯ä»¥ä½¿ç¨å¦ä¸å½ä»¤ï¼
info registers
ï¼2ï¼æ¥çå¯åå¨çæ åµãï¼é¤äºæµ®ç¹å¯åå¨ï¼
info all-registers
ï¼3ï¼æ¥çææå¯åå¨çæ åµãï¼å æ¬æµ®ç¹å¯åå¨ï¼
info registers
ï¼4ï¼æ¥çææå®çå¯åå¨çæ åµã
å¯åå¨ä¸æ¾ç½®äºç¨åºè¿è¡æ¶çæ°æ®ï¼æ¯å¦ç¨åºå½åè¿è¡çæ令å°åï¼ipï¼ï¼ç¨åºçå½åå æ å°åï¼spï¼ççãä½ åæ ·å¯ä»¥ä½¿ç¨printå½ä»¤æ¥è®¿é®å¯åå¨çæ åµï¼åªéè¦å¨å¯åå¨åååå ä¸ä¸ª$符å·å°±å¯ä»¥äºãå¦ï¼p $eipã
7. displayèªå¨æ¾ç¤ºçåé
ï¼1ï¼æ ¼å¼ï¼display[/i|s] [expression | addr]
eg:
display/i $pc
$pcæ¯GDBçç¯å¢åéï¼è¡¨ç¤ºçæ令çå°åï¼/iå表示è¾åºæ ¼å¼ä¸ºæºå¨æ令ç ï¼ä¹å°±æ¯æ±ç¼ãäºæ¯å½ç¨åºåä¸åï¼å°±ä¼åºç°æºä»£ç åæºå¨æ令ç ç¸å¯¹åºçæ å½¢ï¼è¿æ¯ä¸ä¸ªå¾æææçåè½ã
ï¼2ï¼å ¶ä»
undisplay
delete display
å é¤èªå¨æ¾ç¤ºï¼dnumsæ为æ设置好äºçèªå¨æ¾å¼çç¼å·ãå¦æè¦åæ¶å é¤å 个ï¼ç¼å·å¯ä»¥ç¨ç©ºæ ¼åéï¼å¦æè¦å é¤ä¸ä¸ªèå´å çç¼å·ï¼å¯ä»¥ç¨åå·è¡¨ç¤ºï¼å¦ï¼2-5ï¼
disable display
enable display
disableåenalbeä¸å é¤èªå¨æ¾ç¤ºç设置ï¼èåªæ¯è®©å ¶å¤±æåæ¢å¤ã
info display
æ¥çdisplay设置çèªå¨æ¾ç¤ºçä¿¡æ¯ãGDBä¼æåºä¸å¼ è¡¨æ ¼ï¼åä½ æ¥åå½ç¶è°è¯ä¸è®¾ç½®äºå¤å°ä¸ªèªå¨æ¾ç¤ºè®¾ç½®ï¼å ¶ä¸å æ¬ï¼è®¾ç½®çç¼å·ï¼è¡¨è¾¾å¼ï¼æ¯å¦enableã
8. 设置
ï¼1ï¼set print address
set print address on
æå¼å°åè¾åºï¼å½ç¨åºæ¾ç¤ºå½æ°ä¿¡æ¯æ¶ï¼GDBä¼æ¾åºå½æ°çåæ°å°åã
ï¼2ï¼set print array
set print array on
æå¼æ°ç»æ¾ç¤ºï¼æå¼åå½æ°ç»æ¾ç¤ºæ¶ï¼æ¯ä¸ªå ç´ å ä¸è¡ï¼å¦æä¸æå¼çè¯ï¼æ¯ä¸ªå ç´ å以éå·åéã
ï¼3ï¼set print elements
è¿ä¸ªé项主è¦æ¯è®¾ç½®æ°ç»çï¼å¦æä½ çæ°ç»å¤ªå¤§äºï¼é£ä¹å°±å¯ä»¥æå®ä¸ä¸ªæ¥æå®æ°æ®æ¾ç¤ºçæ大é¿åº¦ï¼å½å°è¾¾è¿ä¸ªé¿åº¦æ¶ï¼GDBå°±ä¸åå¾ä¸æ¾ç¤ºäºãå¦æ设置为0ï¼å表示ä¸éå¶ã
ï¼4ï¼set print null-stop
å¦ææå¼äºè¿ä¸ªé项ï¼é£ä¹å½æ¾ç¤ºå符串æ¶ï¼éå°ç»æ符ååæ¢æ¾ç¤ºãè¿ä¸ªé项é»è®¤ä¸ºoffã
ï¼5ï¼set print pretty on
å¦ææå¼printf prettyè¿ä¸ªé项ï¼é£ä¹å½GDBæ¾ç¤ºç»æä½æ¶ä¼æ¯è¾æ¼äº®ãå¦ï¼
$1 = {
next = 0x0,
flags = {
sweet = 1,
sour = 1
},
meat = 0x "Pork"
}
ï¼6ï¼set print union
设置æ¾ç¤ºç»æä½æ¶ï¼æ¯å¦æ¾å¼å ¶å çèåä½æ°æ®ã
ï¼7ï¼set print object
å¨C++ä¸ï¼å¦æä¸ä¸ªå¯¹è±¡æéæåå ¶æ´¾çç±»ï¼å¦ææå¼è¿ä¸ªé项ï¼GDBä¼èªå¨æç §èæ¹æ³è°ç¨çè§åæ¾ç¤ºè¾åºï¼å¦æå ³éè¿ä¸ªé项çè¯ï¼GDBå°±ä¸ç®¡èå½æ°è¡¨äºã
linuxä½åä½çåºå«
第ä¸ç¹ 设计åè¡·ä¸åï¼
ããä½æä½ç³»ç»ç设计åè¡·æ¯ï¼æ»¡è¶³æºæ¢°è®¾è®¡ååæãä¸ç»´å¨ç»ãè§é¢ç¼è¾ååä½ï¼ä»¥åç§å¦è®¡ç®åé«æ§è½è®¡ç®åºç¨ç¨åºçé¢åä¸éè¦å¤§éå ååæµ®ç¹æ§è½ç客æ·éæ±ãæ¢å¥ç®æçè¯è¯´å°±æ¯ï¼å®ä»¬æ¯é«ç§æ人å使ç¨æ¬è¡ä¸ç¹æ®è½¯ä»¶çè¿è¡å¹³å°ãèä½æä½ç³»ç»æ¯ä¸ºæ®éç¨æ·è®¾è®¡çã
ãã第äºç¹ 寻åè½åä¸åï¼
ããä½å¤çå¨çä¼å¿è¿ä½ç°å¨ç³»ç»å¯¹å åçæ§å¶ä¸ãç±äºå°å使ç¨çæ¯ç¹æ®çæ´æ°ï¼å æ¤ä¸ä¸ªALU(ç®æ¯é»è¾è¿ç®å¨)åå¯åå¨å¯ä»¥å¤çæ´å¤§çæ´æ°ï¼ä¹å°±æ¯æ´å¤§çå°åãæ¯å¦ï¼Windows
Vista x Editionæ¯æå¤è¾¾ GBçå ååå¤è¾¾ TBçèæå åï¼èä½CPUåæä½ç³»ç»æ大åªå¯æ¯æ4Gå å
ãã第ä¸ç¹ è¦æ±é ç½®ä¸åï¼
ããä½æä½ç³»ç»åªè½å®è£ å¨ä½çµèä¸(CPUå¿ é¡»æ¯ä½ç)ãåæ¶éè¦å®è£ ä½å¸¸ç¨è½¯ä»¶ä»¥åæ¥ä½(x)çæä½³æ§è½ãä½æä½ç³»ç»åå¯ä»¥å®è£ å¨ä½(ä½CPU)æä½(ä½CPU)çµèä¸ãå½ç¶ï¼ä½æä½ç³»ç»å®è£ å¨ä½çµèä¸ï¼å ¶ç¡¬ä»¶æ°ä¼¼â大马æå°è½¦âï¼ä½æè½å°±ä¼å¤§æææ£ã
ãã第åç¹ è¿ç®é度ä¸åï¼
ããå ³äºä½åä½ç³»ç»çå·®å«ï¼é£çæ¯è¯´æ¥è¯é¿ï¼è¿éæ们é¦å è¦äºè§£ä¸ä¸CPUçæ¶æææ¯ï¼é常æ们å¯ä»¥çå°å¨è®¡ç®æºç¡¬ä»¶ä¸ä¼æXåXçæ è¯ï¼å ¶å®è¿æ¯ä¸¤ç§ä¸åçCPU硬件æ¶æï¼x代表ä½æä½ç³»ç»
x代表ä½æä½ç³»ç»ãé£ä¹è¿ä¸ªä½åä½ä¸çâä½âåæ¯ä»ä¹ææå¢?ç¸å¯¹äºä½ææ¯èè¨ï¼ä½ææ¯çè¿ä¸ªä½æ°æçæ¯CPU
GPRs(General-Purpose
Registersï¼éç¨å¯åå¨)çæ°æ®å®½åº¦ä¸ºä½ï¼ä½æ令éå°±æ¯è¿è¡ä½æ°æ®çæ令ï¼ä¹å°±æ¯è¯´å¤çå¨ä¸æ¬¡å¯ä»¥è¿è¡bitæ°æ®ã举个éä¿ææä½ä¸æ¯ç¹å«åç¡®çä¾åï¼ä½çååéæ¯1Mï¼èä½ååéæ¯2Mãå³ç论ä¸ä½ç³»ç»æ§è½æ¯ä½çæé«1åã