android app崩溃日志分析,利用NDK崩溃日志查找BUG(android的C++错误查找)

2023-05-16

背景介绍

本文主要内容: 利用android的crash log来对c++开发的android应用进行错误定位.

容易稳定复现的BUG, 一般可以通过断点调试来解决. 如果测试人员也无法稳定复现,

log就成了程序吊定位问题的救命稻草.

通用操作系统都有自己的日志系统, android也不例外. 救命稻草已经给你了~ ( 怎样查看android的系统日志

)

但是, android的系统日志在c++代码崩溃时, 打印的都是内存地址和寄存器. 比如, 这样:

06-20 15:54:35.331 23889 23889 I DEBUG

: *** *** *** *** *** *** *** *** *** *** ***

*** *** *** *** ***

06-20 15:54:35.331 23889 23889 I DEBUG

: Build fingerprint:

'google/razorg/deb:4.4.2/KOT49H/937116:user/release-keys'

06-20 15:54:35.331 23889 23889 I DEBUG

: Revision: '0'

06-20 15:54:35.331 23889 23889 I DEBUG

: pid: 1981, tid: 2020, name: Thread-3399

>>> com.guangyou.ddgame

<<<

06-20 15:54:35.331 23889 23889 I DEBUG

: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR),

fault addr 00000028

06-20 15:54:35.431  187  710 D audio_hw_primary: out_set_parameters:

enter: usecase(0: deep-buffer-playback) kvpairs:

routing=2

06-20 15:54:35.511 23889 23889 I DEBUG

:  r0

76d94458  r1 00000000  r2

00000000  r3 00000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  r4

760c1a48  r5 751e2440  r6

00000001  r7 760c1a48

06-20 15:54:35.511 23889 23889 I DEBUG

:  r8

00000001  r9 76c96f3c  sl

76c861c0  fp 76d94444

06-20 15:54:35.511 23889 23889 I DEBUG

:  ip

00000001  sp 76d94430  lr

75a81bd8  pc 75a81bdc  cpsr

600f0010

06-20 15:54:35.511 23889 23889 I DEBUG

:  d0

746968775f327865  d1

6a6e6169642f675f

06-20 15:54:35.511 23889 23889 I DEBUG

:  d2

5f6f616978757169  d3

676e702e6e776f6d

06-20 15:54:35.511 23889 23889 I DEBUG

:  d4

0000000009000000  d5

0000000000000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  d6

0000000000000000  d7

0000000000000000

这密密麻麻的都是些神马, 是人看的么?

饿. 这个麻… 谁让你当程序猿! 让你当! 活该要看天书!

硬着头皮也要来, 我们就来讲讲怎么消化天书吧~

怎样获取android的系统日志

假设你已经安装了 Android Develop Tools, 可以成功调用adb.

并打开android开发用机的调试模式, 连接到电脑.

打开命令行, 在命令行输入: adb logcat.

就可以看到满屏幕的日志啦.

输入adb logcat --help可以看到 logcat的用法提示.

这里有两个参数特别提醒一下, 比较常用:

1. -v XXXX: 用来选择log输出样式, 一般建议 threadtime,

更加详细.

2. -d: 让log一次性输出后马上完毕. 如果没有此命令, logcat 工具会一直输出,

即使更新在界面上.

如果需要保存log到文件, 方便以后查看. 可输入命令:

adb logcat -v threadtime -d > log.txt

理解NDK的crash log

如果你用c++开发的android应用在运行过程中, c++代码发生错误导致程序崩溃, 系统就会记录 crash

log到上述的系统日志中.

下面是我正在开发的游戏一次崩溃后, 截取的日志

06-20 15:54:35.331 23889 23889 I DEBUG

: *** *** *** *** *** *** *** *** *** *** ***

*** *** *** *** ***

06-20 15:54:35.331 23889 23889 I DEBUG

: Build fingerprint:

'google/razorg/deb:4.4.2/KOT49H/937116:user/release-keys'

06-20 15:54:35.331 23889 23889 I DEBUG

: Revision: '0'

06-20 15:54:35.331 23889 23889 I DEBUG

: pid: 1981, tid: 2020, name: Thread-3399

>>> com.guangyou.ddgame

<<<

06-20 15:54:35.331 23889 23889 I DEBUG

: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR),

fault addr 00000028

06-20 15:54:35.431  187  710 D audio_hw_primary: out_set_parameters:

enter: usecase(0: deep-buffer-playback) kvpairs:

routing=2

06-20 15:54:35.511 23889 23889 I DEBUG

:  r0

76d94458  r1 00000000  r2

00000000  r3 00000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  r4

760c1a48  r5 751e2440  r6

00000001  r7 760c1a48

06-20 15:54:35.511 23889 23889 I DEBUG

:  r8

00000001  r9 76c96f3c  sl

76c861c0  fp 76d94444

06-20 15:54:35.511 23889 23889 I DEBUG

:  ip

00000001  sp 76d94430  lr

75a81bd8  pc 75a81bdc  cpsr

600f0010

06-20 15:54:35.511 23889 23889 I DEBUG

:  d0

746968775f327865  d1

6a6e6169642f675f

06-20 15:54:35.511 23889 23889 I DEBUG

:  d2

5f6f616978757169  d3

676e702e6e776f6d

06-20 15:54:35.511 23889 23889 I DEBUG

:  d4

0000000009000000  d5

0000000000000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  d6

0000000000000000  d7

0000000000000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  d8

0000000000000000  d9

0000000000000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  d10

0000000000000000  d11

0000000000000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  d12

0000000000000000  d13

0000000000000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  d14

0000000000000000  d15

0000000000000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  d16

c3c3c3c3c3c3c3c3  d17

c3c3c3c3c3c3c3c3

06-20 15:54:35.511 23889 23889 I DEBUG

:  d18

41c7ddc227000000  d19

3ff0000000000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  d20

3f811110896efbb2  d21

3fd7096611460fdb

06-20 15:54:35.511 23889 23889 I DEBUG

:  d22

c0176a8ee0000000  d23

bfc5230c760b0605

06-20 15:54:35.511 23889 23889 I DEBUG

:  d24

0000000000000000  d25

3fc7922925a107e2

06-20 15:54:35.511 23889 23889 I DEBUG

:  d26

3fdaa0f8fab43e33  d27

3fb43ad076b251ab

06-20 15:54:35.511 23889 23889 I DEBUG

:  d28

3fa15cb6bdc3c156  d29

3ec6cd878c3b46a7

06-20 15:54:35.511 23889 23889 I DEBUG

:  d30

3f65f3b6b9b97e01  d31

3ef99342e0ee5069

06-20 15:54:35.511 23889 23889 I DEBUG

:  scr

20000012

06-20 15:54:35.511 23889 23889 I DEBUG

:

06-20 15:54:35.511 23889 23889 I DEBUG

: backtrace:

06-20 15:54:35.511 23889 23889 I DEBUG

:  #00

pc 0089cbdc

/data/app-lib/com.guangyou.ddgame-1/libcocos2dcpp.so

(cocos2d::Texture2D::getContentSize() const+32)

06-20 15:54:35.511 23889 23889 I DEBUG

:  #01

pc 0088f8dc

/data/app-lib/com.guangyou.ddgame-1/libcocos2dcpp.so

(cocos2d::Sprite::setTexture(std::string

const&)+128)

06-20 15:54:35.511 23889 23889 I DEBUG

:  #02

pc 007863dc

/data/app-lib/com.guangyou.ddgame-1/libcocos2dcpp.so

(cocos2d::ui::Button::loadTextureDisabled(std::string const&,

cocos2d::ui::Widget::TextureResType)+336)

06-20 15:54:35.511 23889 23889 I DEBUG

:

06-20 15:54:35.511 23889 23889 I DEBUG

: stack:

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d943f0

00000001

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d943f4

4006bc0d  /system/lib/libc.so

(free+12)

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d943f8

76a72c54

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d943fc

75eca614

/data/app-lib/com.guangyou.ddgame-1/libcocos2dcpp.so

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94400

751c23c8

[anon:libc_malloc]

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94404

751c23c8

[anon:libc_malloc]

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94408

751c23c8

[anon:libc_malloc]

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d9440c

75a749b4

/data/app-lib/com.guangyou.ddgame-1/libcocos2dcpp.so

(cocos2d::Sprite::setTexture(cocos2d::Texture2D*)+128)

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94410

0000003d

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94414

00e8efc8

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94418

00000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d9441c

00000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94420

00000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94424

76d94458

[stack:2020]

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94428

00000020

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d9442c

76d94444

[stack:2020]

06-20 15:54:35.511 23889 23889 I DEBUG

:  #00

76d94430  00000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94434

76d94458

[stack:2020]

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94438

76a66184

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d9443c

760c1a48

/data/app-lib/com.guangyou.ddgame-1/libcocos2dcpp.so

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94440

76d9447c

[stack:2020]

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94444

75a748e0

/data/app-lib/com.guangyou.ddgame-1/libcocos2dcpp.so

(cocos2d::Sprite::setTexture(std::string

const&)+132)

06-20 15:54:35.511 23889 23889 I DEBUG

:  #01

76d94448  76d944ec

[stack:2020]

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d9444c

793ff0e8

[anon:libc_malloc]

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94450

76a72c54

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94454

00000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94458

00000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d9445c

00000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94460

00000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94464

00000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d94468

00000000

06-20 15:54:35.511 23889 23889 I DEBUG

:  76d9446c

00000000

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d94470

7b91dcf8

[anon:libc_malloc]

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d94474

78ce6c50

[anon:libc_malloc]

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d94478

76d944b4

[stack:2020]

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d9447c

7596b3e0

/data/app-lib/com.guangyou.ddgame-1/libcocos2dcpp.so

(cocos2d::ui::Button::loadTextureDisabled(std::string const&,

cocos2d::ui::Widget::TextureResType)+340)

06-20 15:54:35.521 23889 23889 I DEBUG

:  #02

76d94480  00000001

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d94484

00000000

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d94488

76d944ec

[stack:2020]

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d9448c

793fe780

[anon:libc_malloc]

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d94490

76d944f0

[stack:2020]

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d94494

793ff0e8

[anon:libc_malloc]

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d94498

00000001

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d9449c

4006bc0d  /system/lib/libc.so

(free+12)

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d944a0

76a72c54

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d944a4

75eca614

/data/app-lib/com.guangyou.ddgame-1/libcocos2dcpp.so

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d944a8

78ce6c50

[anon:libc_malloc]

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d944ac

78ce6c50

[anon:libc_malloc]

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d944b0

76d9455c

[stack:2020]

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d944b4

75924e54

/data/app-lib/com.guangyou.ddgame-1/libcocos2dcpp.so

(cocostudio::ButtonReader::setPropsFromJsonDictionary(cocos2d::ui::Widget*,

rapidjson::GenericValue, rapidjson::MemoryPoolAllocator >

const&)+752)

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d944b8

00000000

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d944bc

78ce6c50

[anon:libc_malloc]

06-20 15:54:35.521 23889 23889 I DEBUG

:

06-20 15:54:35.521 23889 23889 I DEBUG

: memory near r0:

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d94438

76a66184 760c1a48 76d9447c 75a748e0

06-20 15:54:35.521 23889 23889 I DEBUG

:  76d94448

76d944ec 793ff0e8 76a72c54 00000000

...

06-20 15:54:35.521 23889 23889 I DEBUG

:

06-20 15:54:35.521 23889 23889 I DEBUG

: memory near r4:

06-20 15:54:35.521 23889 23889 I DEBUG

:  760c1a28

760811c8 75ee318c 75ee3194 75ee319c

06-20 15:54:35.521 23889 23889 I DEBUG

:  760c1a38

4006d091 75f9a1f4 75f4ee5c 75e8ea0c

...

下面来逐行解读:

1. ndk crash log以*** *** *** ***

***开始.

2. 第一行Build fingerprint:

'google/razorg/deb:4.4.2/KOT49H/937116:user/release-keys'

指明了运行的Android版本, 如果您有多份crash

dump的话这个信息就比较有用了.

3. 接着一行显示的是当前的线程id(pid)和进程id(tid). 如果当前崩溃的线程是主线程的话,

pid和tid会是一样的~

4. 第四行, 显示的是unix信号. 这里的signal 11, 即SIGSEGV, 表示段错误,

是最常见的信号.(什么是unix信号, 什么是SIGSEGV)

5. 接下来的部分是系统寄存器的dump信息.

符号 解释

rX(X=[0~9]) 代表整数寄存器

dX(X=[0~31]) 是浮点指针寄存器

fp (or r11) 指向当前正在执行的函数的堆栈底.

ip (or r12) 一个寄存器, 我也没弄明白是干啥的.

sp (or r13) 当前正在执行的函数的堆栈顶.(跟fp相对应)

lr (or r14) link register. 简单来说,

当当前指令执行完了,

就会从这个寄存器获取地址, 来知道需要返回

到哪里继续执行.

pc (or r15) program counter. 存放下一条指令的地址

cpsr  Current Program Status

Register. 表示当前

运行环境和状态的一些字节位.

6. Crash dump还包含PC之前和之后的一些内存字段.

7. 最后, 是崩溃时的调用堆栈. 如果你执行的是debug版本, 还能还原一些c++代码.

利用ndk-stack定位崩溃代码

上面的一些信息能简单的帮你定位以下问题. 如果信息量还不够大的话, 那就还有最后一招: 还原历史.

Android NDK自从版本R6开始, 提供了一个工具ndk-stack( 在目录{ndk_root}/中 ).

这个工具能自动分析dump下来的crash log, 将崩溃时的调用内存地址和c++代码一行一行对应起来.

我们先看一下用法, 执行命令ndk-stack --help

Usage:

ndk-stack -sym [-dump ]

-sym  Contains full path to the

root directory for symbols.

-dump Contains full path to the file containing

the crash dump.

This is an optional parameter. If ommited,

ndk-stack will

read input data from stdin

-dump参数很容易理解, 即dump下来的log文本文件. ndk-stack会分析此文件.

-sym参数就是你android项目下,编译成功之后,obj目录下的文件.

下面我们就来示范一下:

$ adb logcat | ndk-stack -sym

./obj/local/armeabi

********** Crash dump:

**********

Build fingerprint:

'htc_wwe/htc_bravo/bravo:2.3.3/

GRI40/96875.1:user/release-keys'

pid: 1723, tid: 1743

>>> com.packtpub.droidblaster

<<<

signal 11 (SIGSEGV), code 1

(SEGV_MAPERR), fault addr 0000000c

Stack frame #00  pc

00010a2c

/data/data/com.packtpub.droidblaster/lib/libdroidblaster.so:

Routine update in

/home/packt/Project/Chapter11/DroidBlaster_Part11/jni/TimeService.cpp:25

Stack frame #01  pc

00009fcc

/data/data/com.packtpub.droidblaster/lib/libdroidblaster.so:

Routine onStep in

/home/packt/Project/Chapter11/DroidBlaster_Part11/jni/DroidBlaster.cpp:53

Stack frame #02  pc

0000a348

/data/data/com.packtpub.droidblaster/lib/libdroidblaster.so:

Routine run in

/home/packt/Project/Chapter11/DroidBlaster_Part11/jni/EventLoop.cpp:49

Stack frame #03  pc

0000f994

/data/data/com.packtpub.droidblaster/lib/libdroidblaster.so:

Routine android_main in

/home/packt/Project/Chapter11/DroidBlaster_Part11/jni/Main.cpp:31

...

熟悉的代码出现啦~~

另外还可以这样:

将adb logcat 打印的crash信息保存到文件中然后用ndk-stack 的-dump选项来解析:

adb logcat >

/tmp/log.txt

ndk-stack -sym /obj/local/armeabi -dump

/log.txt

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android app崩溃日志分析,利用NDK崩溃日志查找BUG(android的C++错误查找) 的相关文章

  • Linux的桌面环境gnome、kde、xfce、lxde 等等使用比较

    如果不是加入了图形界面 xff0c 微软的Windows系列操作系统不会成功地占领计算机桌面这块高地 这种人机交换的图形化界面 xff0c 使得界面更加直观 简易 而且更人性化 xff0c 同时也大大减少了使用者的认知负担 xff0c 普通
  • windows服务器不显示字体,Win10打开Word提示“Word无法显示所请求的字体”怎么办?...

    Win10打开Word提示 Word无法显示所请求的字体 怎么办 xff1f Word是我们最常使用的办公软件 xff0c 然而一位用户在Win10系统下打开Word时出错了 xff0c 系统提示 内存或磁盘空间不足 xff0c Word无
  • 在sublime text3中配置并使用LaTex

    准备工作 Sublime Text3 安装并配置好Package Control xff0c 若没有安装也没关系 xff0c 我已经把常用的插件都放到了我的GitHub xff0c 可以按照说明复制到指定路径即可 MiKTeX 下载并安装
  • Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢

    前言 在我们在爬取手机APP上面的数据的时候 xff0c 都会借助Fidder来爬取 今天就教大家如何爬取手机APP上面的数据 环境配置 1 Fidder的安装和配置 下载Fidder软件地址 xff1a https www telerik
  • linux安装redis教程yum,linux下yum安装redis以及使用

    1 yum install redis 安装redis数据库 2 service redis start Redirecting to bin systemctl start redis service 开启redis服务 方式一 开启re
  • 存储过程:数据的插入和更新

    存储过程的功能非常强大 xff0c 在某种程度上甚至可以替代业务逻辑层 xff0c 接下来就一个小例子来说明 xff0c 用存储过程插入或更新语句 1 数据库表结构 所用数据库为Sql Server2008 2 创建存储过程 xff08 1
  • win10下VS2017配置GSL库

    GSL库 xff1a GNU Scientific Library 1 下载 xff1a 下载Complete package except sources和Sources两个exe文件 2 安装 xff1a 将两个exe安装 xff0c
  • 微信开放平台开发——网页微信扫码登录(OAuth2.0)

    1 OAuth2 0 OAuth xff08 开放授权 xff09 是一个开放标准 xff0c 允许用户让第三方应用访问该用户在某一网站上存储的私密的资源 xff08 如照片 xff0c 视频 xff0c 联系人列表 xff09 xff0c
  • 安全和取证Linux发行版Kali Linux 2018.4 发布

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 公告说 xff0c 欢迎来到2018年的第四个也是最后一个版本 xff0c Kali Linux 2018 4 xff0c 可以立即下载 这个版本将我们的内核升级到4 18
  • 使用Rust + Electron开发跨平台桌面应用 ( 二 )

    前言 在上一篇文章使用Rust 43 Electron开发跨平台桌面应用 一 中 xff0c 我们将Rust 43 Electron结合起来 xff0c 使用Rust编写核心业务逻辑 xff0c 并编译成node库提供给Electron的U
  • linux高级文件系统管理——btrfs

    前几天 xff0c 关于高级文件系统方面也给大家分享过RAID和LVM xff0c 今天给大家分享的这款文件系统可能比这两者更先进 xff0c 可以将其二者合二为一 第一 xff0c 它可以使用磁盘或者分区大小不一样的设备组建RAID xf
  • 字符串 - 字符串排序

    1 字符串排序 对于许多排序应用来说 xff0c 决定顺序的键都是字符串 给定一列字符串 xff0c 需要按一定顺序排列整齐方便后序处理 2 键索引计数法 这个方法名字有点拗口 xff0c 过程有点绕 xff0c 但是每一步其实很简单 举个
  • iOS-高德地图API的定位与搜索功能

    环境 xff1a Xcode10 1 Swift4 2 真机6s xff0c ios11 Demo xff1a https github com cxymq AmapSwift 高德地图API使用 需要 xff08 https lbs am
  • iOS 录音,播放并上传

    1 界面布局 xff0c 以及相关功能 点击中间开始录音 xff0c 点击左上角播放或暂停播放 xff0c 点击右上角移除文件 2 定义相关属性 import 34 SendVoiceController h 34 import impor
  • 【Python基础】request.post()方法

    00 序言 爬取懂che帝的车型信息时 xff0c 没太整明白request post 里面的参数是干什么用的 xff0c 所以写篇学习笔记提醒一下自己 url 61 39 https www dongchedi com motor bra
  • 老虎证券web端PWA实践总结

    历时两个月 xff0c PWA功能终于在web端稳定落地使用 xff0c 网站 web itiger com 从最新研究到落地上线 xff0c 遇到不少坑 xff1b 开发过程中也参考了不少资料 xff0c 但总有那么几个是没有答案 xff
  • 硬盘inode节点简单介绍

    一 inode是什么 xff1f 理解inode xff0c 要从文件储存说起 文件储存在硬盘上 xff0c 硬盘的最小存储单位叫做 34 扇区 34 xff08 Sector xff09 每个扇区储存512字节 xff08 相当于0 5K
  • NoMachine 远程桌面控制

    它是一个基于企业级对比套装的开源的终端服务器 它允许用户在连接速度缓慢或者窄带宽的情况下 xff0c 对X11会话进行远程访问 NX项目提供一整套的运行库文件以及优化的来自X11 xff0c SMB xff0c IPP xff0c HTTP
  • Angular之路--带你来搭建Webpack 2 + Angular 4项目

    上个月Angular发布了4 0 0版本 xff0c 少年们 xff0c 赶快学起来吧 xff0c 这篇文章带领大家搭建一个简单的Angular应用 xff0c 会尽量详细的把每个点都解释到 首先我选择了用webpack2来作为打包工具 x
  • C- unsigned :1之位域分析

    1 首先回忆结构体 我们都知道定义一个结构体可以这样的方式定义 struct Point float x float y point 等价于 struct Point point 除此之外 如果不想声明结构体 只想定义结构体的话 还可以这样

随机推荐