CentOS Yum Source && How to replace an package with official package

Config to use centos official yum source: 

For CentOS 7 or Redhat 7:

  1. Download the KEY file and put it in right place:

wget http://vault.centos.org/7.0.1406/os/x86_64/RPM-GPG-KEY-CentOS-7 

mv RPM-GPG-KEY-CentOS-7 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 

2. edit repo file:

vim /etc/yum.repos.d/centos.repo

put the following content in:

###########################begin########

[base]

name=CentOS-$releasever – Base

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra

#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates

[updates]

name=CentOS-$releasever – Updates

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra

#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful

[extras]

name=CentOS-$releasever – Extras

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra

#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages

[centosplus]

name=CentOS-$releasever – Plus

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra

#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/

gpgcheck=1

enabled=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

##############EOF###############

Commands for replace package with another:

e.g, replacing zlib-1.2.7-13.2.alios7.x86_64 package with zlib-1.2.7-13.el7.x86_64, and then install zlib.i686 

(If you do not replacezlib-1.2.7-13.2.alios7.x86_64 with zlib-1.2.7-13.el7.x86_64, zlib.i686 could not be installed. because, both 64 and 32 bit arch softwares only could be intalled together with exactly same version. Otherwise error occurs like:

Error:  Multilib version problems found. This often means that the root

       cause is something else and multilib version checking is just

       pointing out that there is a problem.

)

commands:

#yum shell

Loaded plugins: langpacks

> remove zlib

> install zlib

> run

–> Running transaction check

—> Package zlib.x86_64 0:1.2.7-13.el7 will be installed

—> Package zlib.x86_64 0:1.2.7-13.2.alios7 will be erased

….

JetBrain WebStorm 注册码

用了一下!真的好使!! 记录了

webStorm :

UserName:William
===== LICENSE BEGIN =====
45550-12042010
00001SzFN0n1bPII7FnAxnt0DDOPJA
INauvJkeVJBuE5bqLEznccE4tet6tr
RiyoMxDK8oDY93tx!ipPyGmqYYeWxS
===== LICENSE END =====
UserName:Microsoft
===== LICENSE BEGIN =====
44827-12042010
00001xZTATXBeJGHI0CFFRIdOKjhQ7
eiwIjgK7qohmwGSZRUK!lINYbpNQKk
5AtC16jzcy6KWlkBBjTZXwL8fnebTM
===== LICENSE END =====
UserName:ChinaRed
===== LICENSE BEGIN =====
41806-12042010
000006gMpIpRoMPJdqqPfxIYyr5UPx
fTuYnZxklVYrNOZUHL6YnHTAUM4zqe
qNrt8QzsZERfO”XiHa802ejK9GtcSj
===== LICENSE END =====

rubyMine :
UserName:William
===== LICENSE BEGIN =====
73770-12042010
00000LsPnluU7HZh4TgJoxNDbnCr!T
0yDfranplDJF4ESFHxfhN6dMBEogxt
S!qZH7LvIjab”9qbXrSfL9NitEBODm
===== LICENSE END =====
UserName:Microsoft
===== LICENSE BEGIN =====
05071-12042010
00001DGDB7Ih6YT6ApG0Uh4wxMwJqf
UjDDJvi5mX0yJS!72q8ZrLhKQfusV”
NVSB9iV!lO1tRbt265″z0vZJBwpl!9
===== LICENSE END =====
UserName:ChinaRed
===== LICENSE BEGIN =====
26405-12042010
00001cYtAkKGNyQA7Er6A9e4oS2Y”I
fK”d”APYe591kwLAHVZ7ieFmfoTKTS
90BTaTdrTg36JEivKlxfVaDszIkWuM
===== LICENSE END =====

phpStorm :
UserName:William
===== LICENSE BEGIN =====
56731-12042010
00001F”L73xP5zfOyL58″Vg0hu”R8S
!aPyCtkqgqc5fEvdQLlLs5a9gzvAcu
!2Gb!gp9kfKoAp1e81dVuhM”a8OJ4v
===== LICENSE END =====
UserName:Microsoft
===== LICENSE BEGIN =====
06656-12042010
00002NFsdQw64GSoAeS1!oxQRM!H8k
Rh3soGkXar1UJa27G0Gx3uz4FEq6Fb
CW09ado0neq”3gqd3lZ8KnE303G”MP
===== LICENSE END =====
UserName:ChinaRed
===== LICENSE BEGIN =====
83865-12042010
00001jJvs5lu13QqsSxk1XXwwpiGL1
4GGM”RKB0xBaYtK6Uh4NVG26″TBhTA
HNKvcsV38NwMho1Wdy75KY61SwSdVQ
===== LICENSE END =====

pyCharm :
UserName:William
===== LICENSE BEGIN =====
43064-12042010
00002qm1!PHwV!dC19Cvu04E6IXZJ9
GN”RaF03!bwPE”x3RZbg7ctJld7yZl
XkVf40g3JJGG4Ibbbg4″HQPwWJWSFU
===== LICENSE END =====
UserName:Microsoft
===== LICENSE BEGIN =====
77380-12042010
000017q0LbsOLEIcYF3VRZszWAYE”K
CYfpWmqrUTJy”ROE03pXMWLZ6Z9jbh
cccsmd3P32vdo!L4tnEkp1jrOuySvx
===== LICENSE END =====
UserName:ChinaRed
===== LICENSE BEGIN =====
42852-12042010
00000zw1KaqXWsbN7MiExhdvN!PIjf
ZDCOi0vxBEGX9QDUYIyvr0768OloCU
FUZ4Evyh4lNEFKRDEVnKye9W2DYxPp
===== LICENSE END =====

openssl建立多级CA签发证书

平时我们自己签发CA证书再签发服务器证书的场景其实都非常简单。浏览器把自签CA导入后,就可以信任由这个CA直接签发的服务器证书。

但是实际上网站使用的证书肯定都不是由根CA直接签发的,比如

淘宝登陆服务器使用的证书。

我之前是自己写了脚本由自签CA直接签发服务器证书,为了真清楚的理解一下证书链的作用就直接使用openssl先签发2层的子CA,再由子CA去签发服务器证书。
手动签发证书的脚本如下:
生成自签CA

点击(此处)折叠或打开

  1. # cat makerootca.sh
  2. #!/bin/bash
  3. DIR=/root/ssl.test2
  4. mkdir -p $DIR/demoCA/{private,newcerts}
  5. touch $DIR/demoCA/index.txt
  6. echo 01 > $DIR/demoCA/serial
  7. openssl genrsa -des3 -out $DIR/demoCA/private/cakey.pem 2048
  8. openssl req -new -x509 -days 3650 -key $DIR/demoCA/private/cakey.pem -out $DIR/demoCA/careq.pem

签发二级CA的脚本

点击(此处)折叠或打开

  1. # cat no2domain.sh
  2. #!/bin/bash
  3. NAME=$1
  4. DIR=$(pwd)/autoget
  5. openssl genrsa -des3 -out $DIR/$NAME.key 2048
  6. openssl rsa -in $DIR/$NAME.key -out $DIR/$NAME.key
  7. openssl req -new -days 3650 -key $DIR/$NAME.key -out $DIR/$NAME.csr
  8. openssl ca -extensions v3_ca -in $DIR/$NAME.csr -config ./openssl.cnf -days 3000 -out $DIR/$NAME.crt -cert $DIR/../demoCA/careq.pem -keyfile $DIR/../demoCA/private/cakey.pem

 

sh no2domain.sh  no2

签发三级CA的脚本

点击(此处)折叠或打开

  1. # cat no3domain.sh
  2. #!/bin/bash
  3. [ $# -ne 1 ] && echo “$0 NAME” && exit
  4. NAME=$1
  5. DIR=$(pwd)/autoget
  6. openssl genrsa -des3 -out $DIR/$NAME.key 2048
  7. openssl rsa -in $DIR/$NAME.key -out $DIR/$NAME.key
  8. openssl req -new -days 3650 -key $DIR/$NAME.key -out $DIR/$NAME.csr
  9. openssl ca -in $DIR/$NAME.csr -extensions v3_ca -config ./openssl.cnf -days 3000 -out $DIR/$NAME.crt -cert $DIR/no2.crt -keyfile $DIR/no2.key

   sh no3domain.sh  no3

由三级CA签发服务器证书的脚本

点击(此处)折叠或打开

  1. # cat no4domain.sh
  2. #!/bin/bash
  3. [ $# -ne 1 ] && echo “$0 NAME” && exit
  4. NAME=$1
  5. DIR=$(pwd)/autoget
  6. openssl genrsa -des3 -out $DIR/$NAME.key 2048
  7. openssl rsa -in $DIR/$NAME.key -out $DIR/$NAME.key
  8. openssl req -new -days 3650 -key $DIR/$NAME.key -out $DIR/$NAME.csr
  9. openssl ca -in $DIR/$NAME.csr -config ./openssl.cnf -days 3000 -out $DIR/$NAME.crt -cert $DIR/no3.crt -keyfile $DIR/no3.key

 sh no4domain.sh my.domain.net

当我们把使用三级CA签发的服务器证书配置在nginx 上时,在已经导入根CA的浏览器上肯定是会遇到证书报警的,然后依次把三级CA(no3.crt  )和二级CA(no2.crt)追加到服务器证书后面,浏览器ssl链接成功,点击证书查看如下图:

Eclipse快捷键 10个最有用的快捷键

Eclipse中10个最有用的快捷键组合

一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合。通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升。    1. ctrl+shift+r:打开资源

这可能是所有快捷键组合中最省时间的了。这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xml。美中不足的是这组快捷键并非在所有视图下都能用。
【转】eclipse快捷键 10个最有用的快捷键

2. ctrl+o:快速outline

如果想要查看当前类的方法或某个特定方法,但又不想把代码拉上拉下,也不想使用查找功能的话,就用ctrl+o吧。它可以列出当前类中的所有方法及属性,你只需输入你想要查询的方法名,点击enter就能够直接跳转至你想去的位置。
【转】eclipse快捷键 10个最有用的快捷键

3. ctrl+e:快速转换编辑器

这组快捷键将帮助你在打开的编辑器之间浏览。使用ctrl+page down或ctrl+page up可以浏览前后的选项卡,但是在很多文件打开的状态下,ctrl+e会更加有效率。
eclipse快捷键 10个最有用的快捷键

4. ctrl+2,L:为本地变量赋值

开发过程中,我常常先编写方法,如Calendar.getInstance(),然后通过ctrl+2快捷键将方法的计算结果赋值于一个本地变量之上。 这样我节省了输入类名,变量名以及导入声明的时间。Ctrl+F的效果类似,不过效果是把方法的计算结果赋值于类中的域。

    5. alt+shift+r:重命名

重命名属性及方法在几年前还是个很麻烦的事,需要大量使用搜索及替换,以至于代码变得零零散散的。今天的Java IDE提供源码处理功能,Eclipse也是一样。现在,变量和方法的重命名变得十分简单,你会习惯于在每次出现更好替代名称的时候都做一次重命名。要使 用这个功能,将鼠标移动至属性名或方法名上,按下alt+shift+r,输入新名称并点击回车。就此完成。如果你重命名的是类中的一个属性,你可以点击alt+shift+r两次,这会呼叫出源码处理对话框,可以实现get及set方法的自动重命名。

    6. alt+shift+l以及alt+shift+m:提取本地变量及方法

源码处理还包括从大块的代码中提取变量和方法的功能。比如,要从一个string创建一个常量,那么就选定文本并按下alt+shift+l即可。如果同 一个string在同一类中的别处出现,它会被自动替换。方法提取也是个非常方便的功能。将大方法分解成较小的、充分定义的方法会极大的减少复杂度,并提 升代码的可测试性。

    7. shift+enter及ctrl+shift+enter

Shift+enter在当前行之下创建一个空白行,与光标是否在行末无关。Ctrl+shift+enter则在当前行之前插入空白行。

    8. Alt+方向键

这也是个节省时间的法宝。这个组合将当前行的内容往上或下移动。在try/catch部分,这个快捷方式尤其好使。

    9. ctrl+m

大显示屏幕能够提高工作效率是大家都知道的。Ctrl+m是编辑器窗口最大化的快捷键。

    10. ctrl+.及ctrl+1:下一个错误及快速修改

ctrl+.将光标移动至当前文件中的下一个报错处或警告处。这组快捷键我一般与ctrl+1一并使用,即修改建议的快捷键。新版Eclipse的修改建 议做的很不错,可以帮你解决很多问题,如方法中的缺失参数,throw/catch exception,未执行的方法等等。
eclipse快捷键 10个最有用的快捷键

更多快捷键组合可在Eclipse按下ctrl+shift+L查看。

让我们按照使用频率来看看我最爱用的一些热键组合。(注:以下内容在Eclipse3.02及一上版本通过测试)

1. Control-Shift-T: 打开类型(Open type)。如果你不是有意磨洋工,还是忘记通过源码树(source tree)打开的方式吧。用eclipse很容易打开接口的实现类的,按ctrl+t会列出接口的实现类列表

2. Control-Shift-R: 打开资源(不只是用来寻找Java文件)。小提示:利用Navigator视图的黄色双向箭头按钮让你的编辑窗口和导航器相关联。这会让你打开的文件对应显示在导航器的层级结构中,这样便于组织信息。如果这影响了速度,就关掉它。

3. F3: 打开申明(Open declaration)。或者,利用Declaration Tab(在Java视图模式下,选择Windows –> Show View — > Declaration)。当你选中代码中的一个方法,然后按这个按键,它会把整个方法在申明方框里显示出来。

4. Alt-left arrow: 在导航历史记录(Navigation History)中后退。就像Web浏览器的后退按钮一样,在利用F3跳转之后,特别有用。(用来返回原先编译的地方)

5. Alt-right arrow: 导航历史记录中向前。

6. Control-Q: 回到最后一次编辑的地方。这个快捷键也是当你在代码中跳转后用的。特别是当你钻的过深,忘记你最初在做什么的时候。

7. Control-Shift-G: 在workspace中搜索引用(reference)这 是重构的前提。对于方法,这个热键的作用和F3恰好相反。它使你在方法的栈中,向上找出一个方法的所有调用者。一个与此相关的功能是开启“标记”功能 (occurrence marking) 。选择Windows->Preferences->Java-> Editor-> Mark Occurrences,勾选选项。这时,当你单击一个元素的时候,代码中所有该元素存在的地方都会被高亮显示。我个人只使用“标记本地变量”(Mark Local Variables)。注意:太多的高亮显示会拖慢Eclipse。

8. Control-Shift-F: 根据代码风格设定重新格式化代码。我 们的团队有统一的代码格式,我们把它放在我们的wiki上。要这么做,我们打开Eclipse,选择Window Style,然后设置Code Formatter,Code Style和Organize Imports。利用导出(Export)功能来生成配置文件。我们把这些配置文件放在wiki上,然后团队里的每个人都导入到自己的Eclipse中。

9. Control-O: 快速概要(quick outline)。通过这个快捷键,你可以迅速的跳到一个方法或者属性,只需要输入名字的头几个字母。

10. Control-/: 对一行注释或取消注释。对于多行也同样适用。

11. Control-Alt-down arrow: 复制高亮显示的一行或多行。

12. Alt-down arrow: 将一行或多行向下移动。Alt-up arrow会向上移动。

其他的热键在菜单里有。你可以通过按下Control-Shift-L(从3.1版本开始), 看到所有快捷键的列表。按下Control-Shift-L两次,会显示热键对话框(Keys Preferences dialog),你可以在这里自己设置热键。我欢迎你在Talkback部分发表你的Eclipse提示。

其他的Eclipse窍门

我总结了几个相关的小窍门:

锁定命令行窗口:在命令行视图中(Window ->Show View ->Other ->Basic ->Console),试试看用滚动锁定按钮来锁定控制台输出不要滚屏。

使用Ant视图: 在我的Java或Debug模式下,我喜欢显示出Ant视图,这样我就可以迅速的运行Ant任务。通过Window Ant可以找到该视图。把Ant视图放在屏幕的一角, 通过“添加编译文件(Addà Other à Show View à Buildfiles)”按钮来添加build.xml文件。在3.1版本中,甚至支持Ant调试脚本语言。

自动遍历一个集合:for + Control-Space: 如果你还不知道,那么你应该记住Control-Space是自动完成功能。在Eclipse中,你还可以自动完成结构。在一个数组或集合范围内,试试看 输入“for”然后按下Control-Space键。Eclipse会问你你想要遍历哪一个集合然后自动完成循环代码。

使用分级布局: 在包浏览视图(Package Explorer view)中默认的布局(扁平式)方式让我困惑,它把包的全名显示在导航树(navigation tree)中。我更喜欢我源码的包和文件系统视图,在Eclipse中叫做分级布局(Hierarchical Layout)。要切换到这种模式,点击包浏览视图中向下的按钮,选择布局(Layout),然后选择分级(Hierarchial)。

一次显示多个文件:你可以一次浏览多个文件。把不在激活状态的编辑窗口拖到激活窗口的底部或侧边的滚动条上,就可以打开该编辑窗口。这是我能描述该窍门的最好方式了。

同时打开两个Eclipse: 要将改动从一个CVS分支上合并到另外一个上,我喜欢通过同时打开两个工作目录(Workspace)不同Eclipse来实现。这样我可以通过比较 CVS上的最新版本看到所有的变化(右键单击工程,然后选择Compare Lastest from HEAD)然后把每一个变化都合并到另外一个CVS分支上。启动多个Eclipse的最简单的方法是利用Eclipseàwith Launcher。

Implementors插件:安装一个能够跳到一个接口的实现的插件。如果你是个dependency injection 粉丝,或者正在基于编写优良的接口工作,那么你需要一个这样的插件来加速代码导航。 你可以在SourceForge找到这个插件。

 

 

Ctrl+Alt+H

如果你想知道一个类的方法到底被那些其他的类调用,那么请选中这个方法名,然后按“Ctrl+Alt+H”,

Eclipse就会显示出这个方法被哪些方法调用,最终产生一个调用关系树。
1. Ctrl+左键

 

 

 

 

 

 

 
这个是大多数人经常用到的,用来查看变量、方法、类的定义

2. Ctrl+O

查看一个类的纲要,列出其方法和成员变量。提示:再多按一次Ctrl+O,可以列出该类继承的方法和变量。

助记:”O”—>”Outline”—>”纲要”

3. Ctrl+T

查看一个类的继承关系树,是自顶向下的,再多按一次Ctrl+T, 会换成自底向上的显示结构。

提示:选中一个方法名,按Ctrl+T,可以查看到有这个同名方法的父类、子类、接口。

助记:”T”——->”Tree”—–>”层次树”

4.Alt+左右方向键

我们经常会遇到看代码时Ctrl+左键,层层跟踪,然后迷失在代码中的情况,这时只需要按“Alt+左方向键

”就可以退回到上次阅读的位置,同理,按“Alt+右方向键”会前进到刚才退回的阅读位置,就像浏览器的

前进和后退按钮一样。

 

 

 

 

 

 

 

 

 

 

导入包:Ctrl+Shift+O
编辑
作用域 功能 快捷键
全局 查找并替换 Ctrl+F
文本编辑器 查找上一个 Ctrl+Shift+K
文本编辑器 查找下一个 Ctrl+K
全局 撤销 Ctrl+Z
全局 复制 Ctrl+C
全局 恢复上一个选择 Alt+Shift+↓
全局 剪切 Ctrl+X
全局 快速修正 Ctrl1+1
全局 内容辅助 Alt+/
全局 全部选中 Ctrl+A
全局 删除 Delete
全局 上下文信息 Alt+?
Alt+Shift+?
Ctrl+Shift+Space
Java编辑器 显示工具提示描述 F2
Java编辑器 选择封装元素 Alt+Shift+↑
Java编辑器 选择上一个元素 Alt+Shift+←
Java编辑器 选择下一个元素 Alt+Shift+→
文本编辑器 增量查找 Ctrl+J
文本编辑器 增量逆向查找 Ctrl+Shift+J
全局 粘贴 Ctrl+V
全局 重做 Ctrl+Y
查看
作用域 功能 快捷键
全局 放大 Ctrl+=
全局 缩小 Ctrl+-
窗口
作用域 功能 快捷键
全局 激活编辑器 F12
全局 切换编辑器 Ctrl+Shift+W
全局 上一个编辑器 Ctrl+Shift+F6
全局 上一个视图 Ctrl+Shift+F7
全局 上一个透视图 Ctrl+Shift+F8
全局 下一个编辑器 Ctrl+F6
全局 下一个视图 Ctrl+F7
全局 下一个透视图 Ctrl+F8
文本编辑器 显示标尺上下文菜单 Ctrl+W
全局 显示视图菜单 Ctrl+F10
全局 显示系统菜单 Alt+-
导航
作用域 功能 快捷键
Java编辑器 打开结构 Ctrl+F3
全局 打开类型 Ctrl+Shift+T
全局 打开类型层次结构 F4
全局 打开声明 F3
全局 打开外部javadoc Shift+F2
全局 打开资源 Ctrl+Shift+R
全局 后退历史记录 Alt+←
全局 前进历史记录 Alt+→
全局 上一个 Ctrl+,
全局 下一个 Ctrl+.
Java编辑器 显示大纲 Ctrl+O
全局 在层次结构中打开类型 Ctrl+Shift+H
全局 转至匹配的括号 Ctrl+Shift+P
全局 转至上一个编辑位置 Ctrl+Q
Java编辑器 转至上一个成员 Ctrl+Shift+↑
Java编辑器 转至下一个成员 Ctrl+Shift+↓
文本编辑器 转至行 Ctrl+L
搜索
作用域 功能 快捷键
全局 出现在文件中 Ctrl+Shift+U
全局 打开搜索对话框 Ctrl+H
全局 工作区中的声明 Ctrl+G
全局 工作区中的引用 Ctrl+Shift+G
文本编辑
作用域 功能 快捷键
文本编辑器 改写切换 Insert
文本编辑器 上滚行 Ctrl+↑
文本编辑器 下滚行 Ctrl+↓
文件
作用域 功能 快捷键
全局 保存 Ctrl+X
Ctrl+S
全局 打印 Ctrl+P
全局 关闭 Ctrl+F4
全局 全部保存 Ctrl+Shift+S
全局 全部关闭 Ctrl+Shift+F4
全局 属性 Alt+Enter
全局 新建 Ctrl+N
项目
作用域 功能 快捷键
全局 全部构建 Ctrl+B
源代码
作用域 功能 快捷键
Java编辑器 格式化 Ctrl+Shift+F
Java编辑器 取消注释 Ctrl+/
Java编辑器 注释 Ctrl+/
Java编辑器 添加单个import Ctrl+Shift+M
Java编辑器 组织多个import Ctrl+Shift+O
Java编辑器 使用try/catch块来包围 未设置,太常用了,所以在这里列出,建议自己设置。
也可以使用Ctrl+1自动修正。
调试/运行
作用域 功能 快捷键
全局 单步返回 F7
全局 单步跳过 F6
全局 单步跳入 F5
全局 单步跳入选择 Ctrl+F5
全局 调试上次启动 F11
全局 继续 F8
全局 使用过滤器单步执行 Shift+F5
全局 添加/去除断点 Ctrl+Shift+B
全局 显示 Ctrl+D
全局 运行上次启动 Ctrl+F11
全局 运行至行 Ctrl+R
全局 执行 Ctrl+U
重构
作用域 功能 快捷键
全局 撤销重构 Alt+Shift+Z
全局 抽取方法 Alt+Shift+M
全局 抽取局部变量 Alt+Shift+L
全局 内联 Alt+Shift+I
全局 移动 Alt+Shift+V
全局 重命名 Alt+Shift+R
全局 重做 Alt+Shift+Y

 

 

 

 

 

 

 

 

(1)Ctrl+M切换窗口的大小
(2)Ctrl+Q跳到最后一次的编辑处
(3)F2当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Tooltip

Description。
F3跳到声明或定义的地方。
F5单步调试进入函数内部。
F6单步调试不进入函数内部,如果装了金山词霸2006则要把“取词开关”的快捷键改成其他的。
F7由函数内部返回到调用处。
F8一直执行到下一个断点。
(4)Ctrl+Pg~对于XML文件是切换代码和图示窗口
(5)Ctrl+Alt+I看Java文件中变量的相关信息
(6)Ctrl+PgUp对于代码窗口是打开“Show List”下拉框,在此下拉框里显示有最近曾打开的文件
(7)Ctrl+/ 在代码窗口中是这种//~注释。
Ctrl+Shift+/ 在代码窗口中是这种/*~*/注释,在JSP文件窗口中是〈!–~–〉。
(8)Alt+Shift+O(或点击工具栏中的Toggle Mark Occurrences按钮) 当点击某个标记时可使本页面中其他

地方的此标记黄色凸显,并且窗口的右边框会出现白色的方块,点击此方块会跳到此标记处。
(9)右击窗口的左边框即加断点的地方选Show Line Numbers可以加行号。
(10)Ctrl+I格式化激活的元素Format Active Elements。
Ctrl+Shift+F格式化文件Format Document。
(11)Ctrl+S保存当前文件。
Ctrl+Shift+S保存所有未保存的文件。
(12)Ctrl+Shift+M(先把光标放在需导入包的类名上) 作用是加Import语句。
Ctrl+Shift+O作用是缺少的Import语句被加入,多余的Import语句被删除。
(13)Ctrl+Space提示键入内容即Content Assist,此时要将输入法中Chinese(Simplified)IME-

Ime/Nonlme Toggle的快捷键(用于切换英文和其他文字)改成其他的。
Ctrl+Shift+Space提示信息即Context Information。
(14)双击窗口的左边框可以加断点。
(15)Ctrl+D删除当前行。

Eclipse快捷键大全
Ctrl+1 快速修复(最经典的快捷键,就不用多说了)
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)

Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)

Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性

Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Shift+Ctrl+Enter 在当前行插入空行(原理同上条)

Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+O 快速显示 OutLine
Ctrl+T 快速显示当前类的继承结构
Ctrl+W 关闭当前Editer
Ctrl+K 参照选中的Word快速定位到下一个
Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)

Ctrl+/(小键盘) 折叠当前类中的所有代码

Ctrl+×(小键盘) 展开当前类中的所有代码

Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用

Alt+/来代替)

Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)

Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有

,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)

Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)

Ctrl+Shift+F4 关闭所有打开的Editer

Ctrl+Shift+X 把当前选中的文本全部变味小写

Ctrl+Shift+Y 把当前选中的文本全部变为小写

Ctrl+Shift+F 格式化当前代码

Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之

)

下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开

头的了)

Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)

Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)

Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)

Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)

Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)

Alt+Shift+I 合并变量(可能这样说有点不妥Inline)
Alt+Shift+V 移动函数和变量(不怎么常用)
Alt+Shift+Z 重构的后悔药(Undo)

链接http://hi.baidu.com/lzycsd/blog/item/dcce5989a3f559bb0f2444cb.html

[Android]Android的常用adb命令

第一部分:

1. ubuntu下配置环境anroid变量:

在终端执行 sudo gedit /etc/profile 打开文本编辑器,在最后追加#set android environment

2. 运行Eclipse,还需要配置JAVA环境变量

#set java environment

JAVA_HOME=/home/loginname/jdk目录名

JRE_HOME=/home/loginname/jdk目录名/jre

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

export PATH=/home/loginname/android-sdk-linux_86/tools:$PATH

保存后,重启

3. 加入设备ID标识到当前的android调试环境

在/home/loginname/.android文件中添加,android终端的设备标识ID

4. 更新sdk

【android update sdk】更新sdk

5. 常用命令:

【adb help】获取帮助

【adb get-serialno】获取设备串号

【adb root】获取root权限,对部分手机有用,大部分上市手机已经把这个功能给关闭了。获取root权限还可以通过豌豆夹等第三方工具。

【adb kill-server】杀死adb的server进程。

【adb start-server】启动adb的server进程。

【adb devices】查看建立连接的android终端。

【android list】显示所有android终端

【ddms】启动ddms

【adb remount】重新加载硬盘。

【adb reboot】重新启动终端。

【adb install /path/appname】安装应用程序

【adb uninstall com.android.helloworld】卸载helloworld,系统带的应用不可卸载。

【adb push /sourcepath/filename /destinationpath/filename】从pc端拷贝一个文件到终端

【adb pull /sourcepath/filename /destinationpath/filename】从终端拷贝一个文件到pc端

【adb logcat -v time -s TAGNAME】显示自定义的TAGNAME并显示时间

【adb ppp】通过usb启动ppp

【adb monkey -p /path/appname -v 100】对程序进行强制测试100次

【adb shell】在pc端启动shell命令终端。

以上命令需要pc端的root权限,命令失效时,可以尝试切换工作目录到sdk的tools下,例如:sudo ./adb kill-server,sudo ./adb start-server。

6. shell下命令,可以使用BusyBox工具集:

【am start -n {包名(package)}/{包名}.{活动activity名称}】启动某一个app的activity,配置参考AndroidManifest.xml,例如闹钟:
# am start -n com.android.alarmclock/com.android.alarmclock.AlarmClock

【am broadcast -a android.intent.action.ActionName】发送广播消息

【setprop KEY VALUE】设置key的property值位value

【getprop KEY】获取该key的property值

【getevent】获取所有事件

【watchprops】监听property值的变化

【stop SERVER】强行停止某一个服务

【start SERVER】启动某一个服务

【ioctl】控制设备

【dumpsys activity】显示活动栈信息

【top】显示瞬间的进程的资源占用等信息

【free】显示当前进程内存使用情况

【ps】显示进程的自身标识信息

【rm /path/filename】从终端删除一个文件

【mkdir】新建一个目录或者文件

【grep】查找特定内容

【ls】显示当前目录下的文件

【cd】切换当前目录

【chmod】更改文件属性

【cp】拷贝文件

【dd】复制文件

【mv】移动目录文件,或者改名

【cat】查看文件内容

【kill】杀死进程

【ipconfig】查看更改网络接口地址和参数

【ping】检测网络状态

【netstat】查看网络状态

【telnet】登录远程主机

【sqlite3 /path/DATABASENAME.db】打开某一个数据库。之后即可使用select,insert,delete等数据库操作命令

【tcpdump -p -nnn -vvv -s 0 -w /PATH/NAME.pcap port 80 and tcp】网络调试抓包

【gst-launch playbin uri=file:///system/media/audio/bootaudio.mp3】gst多媒体框架,播放音频文件

【alsa_amixer】音频调试命令,可以切换声道,调节音量,切换设备。不同的芯片厂家的参数设置有所不同。

【alsa_aplay -D AndroidPlayback_Speaker_normal  /cache/music/dial/0.wav】通过alsa播放pcm码流。

【alsa_arecord】通过alsa实现录音

【am start -n com.android.music/com.android.music.MediaPlaybackActivity -d /sdcard/bootaudio.mp3】启动android进程播放mp3

【stack –symbols-dir=./out/target/product/NAME/symbols ramdump】查看调用堆栈

【exit】退出shell

通过 adb shell, cd /system/bin,ls可以列表出大部分可用的命令。

7. 部分android手机的VenderID

# 0x0525 NXP芯片

# 0x18D1 Broadcom2457双卡芯片

# 0x2314 GHT Moke

# 0x04E8 AnyCall GT-I5508

# 0x22B8 Moto XT701 XT300

# 0x0BB4 HTC A8180

第二部分:

adb(Android Debug Bridge)是Android 提供的一个通用的调试工具,借助这个工具,我们可以很好的调试开发的程序,adb.exe在你安装的android的sdk开发包tools目录下,

adb使用方法:

adb [-d|-e|-s <serialNumber>] <command>

当你发出一个命令,系统启用Android客户端。客户端并不与模拟器实例相关,所以如果双服务器/设备是运行中的,你需要用-d选项去为应被控制的命令确定目标实例。关于使用这个选项的更多信息,可以查看模拟器/设备实例术语控制命令。

1、安装应用到模拟器:

你可以使用adb从你的开发电脑上复制一个应用程序,并且将其安装在一个模拟器/设备实例。像这样做,使用install命令。这个install命令要求你必须指定你所要安装的.apk文件的路径:
adb install <path_to_apk>
为了获取更多的关于怎样创建一个可以安装在模拟器/设备实例上的.apk文件的信息,可参照Android Asset Packaging Tool (aapt).
要注意的是,如果你正在使用Eclipse IDE并且已经安装过ADT插件,那么就不需要直接使用adb(或者aapt)去安装模拟器/设备上的应用程序。否则,ADT插件代你全权处理应用程序的打包和安装.
如果要删除某个应用,按下面操作,例如应用为test:
adb shell
cd /data/app
rm test.apk

2、进入设备或模拟器的shell:

adb shell
通过上面的命令,就可以进入设备或模拟器的shell环境中,在这个Linux Shell中,你可以执行各种Linux 的命令,另外如果只想执行一条shell命令,可以采用以下的方式:
adb shell [command]
如:adb shell dmesg会打印出内核的调试信息。

3、发布端口:

可以设置任意的端口号,做为主机 向模拟器或设备的请求端口。如:
adb forward tcp:5555 tcp:8000

4、从模拟器/设备中拷入或拷出文件:

可以使用adbpull ,push命令将文件复制到一个模拟器/设备实例的数据文件或是从数据文件中复制。install命令只将一个.apk文件复制到一个特定的位置,与其不 同的是,pull和push命令可令你复制任意的目录和文件到一个模拟器/设备实例的任何位置。
从模拟器或者设备中复制文件或目录,使用(如下命):
adb pull <remote> <local>
将文件或目录复制到模拟器或者设备,使用(如下命令)
adb push <local> <remote>
在这些命令中,<local>和<remote>分别指通向自己的发展机(本地)和模拟器/设备实例(远程)上的目标文件/目录的路径
下面是一个例子:
adb push test.txt /data/dat/test/test.txt、

5、查询模拟器/设备实例:

在发布adb命令之前,有必要知道什么样的模拟器/设备实例与adb服务器是相连的。可以通过使用devices
命令来得到一系列相关联的模拟器/设备:
adb devices

作为回应,adb为每个实例都制定了相应的状态信息:
序列号——由adb创建的一个字符串,这个字符串通过自己的控制端口<type>-<consolePort>唯一地识别一个模拟器/设备实例。
下面是一个序列号的例子:
emulator-5554
实例的连接状态有三种状态:
offline — 此实例没有与adb相连接或者无法响应.
device — 此实例正与adb服务器连接。注意这个状态并不能百分之百地表示在运行和操作Android系统,因此这个实例是当系统正在运行的时候与adb连接的。然而,在系统启动之后,就是一个模拟器/设备状态的正常运行状态了.
每个实例的输出都有如下固定的格式:
[serialNumber] [state]
下面是一个展示devices命令和输出的例子 :
$ adb devices
List of devices attached
emulator-5554  device
emulator-5556  device
emulator-5558  device

如果当前没有模拟器/设备运行,adb则返回 no device .

6、查看bug报告:

adb bugreport

7、记录无线通讯日志:

一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令,设置记录:
adb shell
logcat -b radio

8、获取设备的ID和序列号:

adb get-product
adb get-serialno

9、访问数据库SQLite3

adb shell
sqlite3

如要打开已存在数据库:

sqlite3 <路径>/dbname.db

From: http://blog.sina.com.cn/s/blog_6bc0bae70100xs1c.html

sublime text 2 for linux [ubuntu] 安装与破解方法全解

ubuntu安装sublime text 2:

输入一下语句即可:

sudo add-apt-repository ppa:webupd8team/sublime-text-2
sudo apt-get update
sudo apt-get install sublime-text
# or dev version
# sudo apt-get install sublime-text-dev

 

然后就是破解了!

which sublime-text 找到sublime的位置为: /usr/bin/sublime-text

sudo vim /usr/bin/sublime-text  查看sublime安装的真正位置,

我的是:/opt/sublime-text/里面

然后安装以下过程对其破解:【转】亲试成功

Linux 下的Sublime Text 2 版本:2.0.1 Build 2217。

这个版本中破解需要额外的技巧,之前的方法可用的已经不多

1.去其官方网站http://www.sublimetext.com/ 把linux版下载下来,解开压缩包,放在你希望的路径下。

2.用vim将其打开

vim sublime_text

3.将文件转成十六进制形式。vim中输入

:%!xxd

3.在vim中定位至“Thanks”文字附近。

/Thanks

4.接着查找数字串“3342”。

/3342

找到一处3342的地方大致是这个样子 ……4333 3342 3032…….

将这里的3342 改为3242。

5.将文件转换回去。

:%!xxd -r

6.保存文件、退出。

:wq

7.打开程序,去help-enter licence 里贴进去通过程序算出来的Licence,OK 成功了。

如有对程序有希望含有自己签名的需求可以单独联系。

这里贴出来几个算好的供使用。

—–BEGIN LICENSE—–
China
Unlimited User License
EA7E-2861
BE67D2175D3569FDAB9EB5340FAD2822
E7B56B3397A76AA9FBE8AC3D3C65918B
DFC28F2EA158140D9E07853D594818EB
3A237B2E8E98ED257C269548F50EDA34
EF0C7F72D8917DB538A0245E46BFD6B1
85F4EDE331F253530ED67A5C19E92399
04C5F4A1AF4AF3DB5EC49C1FEE17CA76
7E369F8AAE4AC6C6E756B5882E1608B9
—–END LICENSE—–

—–BEGIN LICENSE—–
USA
Unlimited User License
EA7E-1640
763D05839CA08BDA7B0103B5BABF0150
195EE53CC33B569858AFD553F080A9BC
1F678C88A1342AC92CA596FE775E7014
5A0EE55DC2F8DE3C4ED6B5B02FD4DB3C
493FCE3EE61FC0588CDAFAAD731BB47F
FD047777D02A5BE92202B3D3EB59A696
A69DFEF6687D16FCD4443556912A1F62
82DA125263C5BC270CEE7664B5D0CEB9
—–END LICENSE—–

—–BEGIN LICENSE—–
A
Unlimited User License
EA7E-20708
A7281D6781626F2A37D6355121079ACA
DF60119B9D27D4CBDA75FA63D633A671
9521D96D375D8DD95DF3F89231E38F8D
459374CC62D1C1B410C0BDFD2503670E
603BB1DCA7D20E85B0AF19BAE0A59822
F7B1F83659D4D7787C4F040FE9402FCD
B9608A9012BDA8B65524B4DEDE4C00D0
76461448E2AAEC027060C26B038D502B
—–END LICENSE—–

—–BEGIN LICENSE—–
B
Unlimited User License
EA7E-13207
B5C54DD7413302E87A9ED4155E90D5E0
684F7A34714D278ABE2731F0270034E2
9722AEC71E04043C0E9D4496D1DA161B
D76CE81501A247F3E03F57D6EC1E76AE
12BE9CD453D1E651AF4BD187CC10FEB0
EB24FBAB7511F2F37E5F745D13D0641F
7D1BEEE98A9646A02B616BF98EB43F84
B04029D72C610086A666DB318A526A2F
—–END LICENSE—–

—–BEGIN LICENSE—–
Love
Unlimited User License
EA7E-8441
918381ACA844A0379CCAC729059720A4
BC9D409098618744BB45FF23E67568DB
82B926D92157127DB3B4054834D0477F
DD9C2B251A57F2E3259E04AD9B7DB8B8
1778C37C1D3B494671C5F4ECFBD2B519
361CD9624A56C21F54F8DD51F5BDF799
68F9537ED74680494853423904F032BA
3E896607B4D398E8C897A4DD1A8CB449
—–END LICENSE—–

—–BEGIN LICENSE—–
NightM
Unlimited User License
EA7E-5177
8125006DCD9E513CD4F1C217CAD3801D
E72D3130CA1F04CFEDF3696C0F68553D
DC42B172E38962890A87035FCE26049F
15EFA09D4BCC811617915165959A499F
402866AFC08E72615336D863968B60FB
C9167F72F4B25ED5E8E593D2E19F43E7
C7EC9F459EA62F1DD1757DC9967C4801
8E48683A4F0F9CAC3CC0621F2D48292F
—–END LICENSE—–

原创文章,转载请注明: 转载自Definite

本文链接地址: Linux 下 Sublime Text 2 破解

 

 

GDB调试器的使用

  默认情况下,gcc/g++编译的可执行文件是不包含调试信息的,GDB是一个源代码级的调试器,使用GDB调试程序需要程序的源代码、符号及其对应的行号等,其中符号和行号可以是单独的文件,亦可以在编译时嵌入到可执行文件中。使用gcc/g++时使用-g选项即可将必要的调试信息包含到可执行文件中,使用-g3选项还可以将源代码中的宏信息也包含进去。
另外,调试过程中需要随时查看源代码,但源代码并没有包含到可执行文件中。通常GDB在当前目录查找源文件,但某些情况下(比如调试系统命令)需要手动指明源代码的查找目录,directory ~向GDB指明到$HOME下查找源文件。
启动GDB的启动很灵活,它的各种特性,你可以在Shell下通过选项和参数指定,也可以在GDB启动之后在GDB自己的命令行下使用GDB内置的命令来指定。最常用的是直接使用命令gdb PROGRAM启动,这样gdb自动加载符号表等调试信息。若要向被调试程序传递参数,可以采用gdb –args program ARG1 ARG2的形式,其中–args(或者-args)是必须的,它告诉GDB该选项之后已经没有GDB需要的选项了。另外,还可以直接使用gdb启动,然后使用file program加载调试信息。此时若要设置被调试程序的参数,可以使用set命令的args子命令,如set args ARG1 ARG2. 还有一种传递参数的方法,在下面介绍。
断点调试程序,就是使用调试器(Debugger)通过检测和改变被调试程序(Debuggee)的状态、控制其执行的方式找出被调试程序中的错误和潜在的bug。调试程序,观察程序当前的行为的前提是让程序在“适当的时候”暂停运,那么什么是适当的时候呢?使用GDB时,让程序暂停运行需要使用断点。具体地,断点又可以分为普通断点(breakpoint以下简称断点),观察点(watchpoint),捕捉点(watchpoint)三类。
普通断点使用break命令(简写为b)设置。break命令的格式为break [bp-spec] [if CONDITION] [thread THREADNUM],bp-spec指明断点设置的位置,可以是行号、函数名或者指令地址,如果bp-spec省略,则断点被设置在程序所要执行的下一行代码(或者指令)上。if CONDITION指明当程序到达bp-spec位置时,只有CONDITION条件成立时程序才会暂停。thread THREADNUM用在多线程程序的调试中,断点只被设置在指定的线程号(GDB内部而不是系统使用的标号)为THREADNUM的线程上,如果THREADNUM为all则所有线程都会被设置断点。补充下bp-spec可以是函数名b FUNCTIONNAME(重载函数名需要使用”包含才能自动补全),可以是行号b LINENUMBER或者b FILENAME:LINENUMBER,还可以是指令地址b *ADDRESS。另外,break命令还有其它一些变种,比如tbreak设置临时断点,被使用一次就会自动删除,rbreak使用正则表达式来指明函数名。
观察点使用watch命令,命令格式与break相同,但它并不是指明断点的位置,而是指明一个表达式,每当该表达式的值改变时,程序便会被暂停。表达式可以是某个变量、由若干变量组成的表达式或者内存地址。
捕捉点是另一种断点,它使用某种事件的发生作为触发条件,命令各式为catch EVENT。这些事件主要包括异常的抛出和捕获(catch throw/catch)和某个系统调用(catch fork/open/exec, catch syscall CALLNUM)。
查看当前的断点设置情况可以使用breakpoints,也可以使用info breakpoints(或者简写为i b)命令,查看某个断点使用breakpoints bpnum,bpnum为断点号。
使用enable/disable bpnum使某个断点生效和失效,delete bpnum删除断点。bpnum还可以是一个范围,以此批量操作断点,比如d 2-6删除断点2到6。
使用ignore bpnum COUNT还可以使某个断点被或略COUNT次,即是说断点bpnum的前COUNT次到达都不会被触发,知道COUNT递减至0。另外,在COUNT递减至0之前,该断点上的条件是不会被考虑的。
CONDITION bpnum [if condition],修改bpnum上的触发条件,若if被省略,则bpnum断点上的条件将被删除。
运行

GDB启动和加载调试信息后,被调试程序并没有运行。使用run/r或者start命令,GDB建立子进程来运行被调试程序。run和start命令稍有不同,即run仅仅加载程序然后运行,而start会在程序的入口函数(main)设置一个临时断点,程序运行到那里就会暂停,临时断点也随即被清除。另外run和start命令后面都可以加上传递给被调试程序的参数,若不加参数则使用GDB启动时传递的参数或者使用set args命令设置的参数。若要清除参数而不退出GDB,使用不带参数的set args即可。
其它运行相关的命令还有

continue/c,继续运行。
next/n, 下一行,且不进入函数调用
stop/s, 下一行,但进入函数调用
ni或者si, 下一条指令,ni与si的区别同n与s的区别
finish/fini, 继续运行至当前栈帧/函数刚刚退出
until/u, 继续运行至某一行,在循环中时,u可以实现运行至循环刚刚退出,但这取决于循环的实现。

查看

调试的主要工作,我想就是检查程序的状态吧,内存的状态,程序的流程,指令的安排。GDB有多个命令来查看程序的状态,最常用的是list/l, print/p和x和disassemble。

list linenum/function列出第linenum行或者function所在行附近的10行,list *address列出地址address附近的10行。
list列出上一次list命令列出的代码后面的10行
list -,列出上一次list命令列出的代码前的10行
list列出的默认行数可由set listsize size来设置
p /fmt VARIABLE根据fmt指定的格式打印变量VARIABLE的值,常用的fmt有d(decimal), u(unsigned), x(hex), o(octal), c(character), f(float), s(string)
x /nfs ADDRESS是我最喜欢的命令,它显示ADDRESS地址开始的内容,形式由nfs指定。其中n为次数(个数),f是格式,除p命令可以使用的格式外,还可以使用i(instruction)打印指令,s为所打印内容的大小,可以是b(byte), h(half word), w(word, 4bytes), g(8bytes). nfs均可省略,若省略则使用最近一次使用x命令时的值,最初nfs是1dw。
disassemble /[r][m] [ADDRESS]将ADDRESS所在函数进行反汇编,ADDRESS也可以是一个由行号组成的区间。不指定任何选项时disas只简单的列出反汇编指令,指定m(mixed)选项时会对应地列出指令和源代码,指定r(raw)时会打印出指令对应的十六进制编码。

退出

Ctrl-C会终止当前调试的程序(而不是调试器)。q(quit)退出GDB,若退出时被调试程序尚未结束,GDB会提示,请求确认。
其它
help

使用GDB的过程中,如果对某一个命令的用法不清楚,可以随时使用help/h寻求帮助。
info

info/i命令也是一个十分常用的GDB命令,可以查看许多信息。

i program查看被调试程序的运行状态,如进程号、ip(指令指针)、是否运行、停止原因等。
i b [bpnum]查看断点
i f [frame-num]查看当前(或指定)栈帧,i f all还会列出当前栈帧的局部变量
i line LINENUM查看代码行LINENUM,打印其指令地址,此命令后执行x/i可查看该地址处的指令,然后回车即可继续向后查看接下来的指令
i reg查看寄存器状态,i all-reg查看包含浮点堆栈寄存器在内的所有寄存器情况
i args查看当前栈帧的参数
i s追踪栈帧信息,相当于backtrace/bt命令
i threads查看当前进程的线程信息

回到过去

跟踪调试程序的过程中,偶尔会错过一些关键点,不得不重新启动程序。如果错过的这些关键点不容易再现,就更令人懊恼了。GDB提供一种机制可以让你将程序向后调整,重新来过。这种机制叫做checkpoint,你可以在程序运行的关键点处执行checkpoint命令,你将得到一个数字(check-num)来标识这个checkpoint。在以后的某个时刻使用restart check-num将程序回滚到设置该checkpoint的时刻,而此时此刻的“内存状态”恰如彼时彼刻,你可以重新调试这段程序(比如设置不同的变量值来测试不同的情况)。但覆水难收的道理你是懂得,回滚的这段程序之间产生的内存之外的效应是无法恢复的,比如写出到文件的数据收不回来了(但文件的指针偏移是可以恢复的,因为它的值保存在内存),通过网络发出的数据就更要不回来了。
使用i checkpoints可以查看checkpoint信息,比如check-num及其所处代码行。
据我揣测,GDB的这种“回到过去”的伎俩并不是逐步撤销之前运行的指令,而是在checkpoint命令执行的时候,把被调试程序fork/clone了。
多线程

调试多线程程序与普通程序没有太大的区别。

i threads查看当前进程包含的线程的信息,包括线程号及其GDB内部标识号,当前处于前端的线程。
thread thread-num切换到线程thread-num
set scheduler-locking [on|off|step],这是一个比较重要的选项,它控制这当前调试线程与其它线程的执行关系。设置为on时,其它线程不会抢占当前线程。设置为off(默认)时,当前线程执行时随时可能被其它线程抢占。设置为step时,在执行step命令时不会被抢占,但使用next跳过函数调用时可以/可能会被抢占,即调度器会被执行。

技巧

回车。在GDB命令行下,简单的回车会执行上一个命令。而且GDB命令中可以使用回车重复执行的都是有记忆的,如果使用回车,该命令就会根据上一次的执行适当地调整参数重复执行。比如使用l func列出函数func附近的10行代码,接着回车就会打印接下来的10行。使用x/16xw ADDRESS以16进制形式查看ADDRESS处的16个字,接着回车就会以同样的格式打印接下来的16个字。如果你已经set $i=0了,那么通过p a[$i++]然后一直回车就可以依次打印数组a的元素了。x/i $eip打印下一条指令,接着回车就会打印下下一条指令,以此类推。但,有的指令是无法使用回车来重复执行的,比如run/start,总之,通常,你觉得不能/不适合重复执行的命令就无法重复执行。
命令简写,有的命令名称较长甚至很长,但GDB允许用户只使用足以区别其它命令的前几个字符来执行命令,当然你也可以使用TAB自动补全。另外一些极为常用的命令有专门的简写形式,通常只有一个字母,例如break/b, list/l, info/i, continue/c, next/n, step/s, nexti/ni, stepi/si, frame/f, print/p等等等等。
在GDB中可以自定义变量(仅供GDB内部使用),很多时候可以方便查看一些表达式的值。有的时候使用变量似乎是必须的,比如x *($esp)是不合法的,因为GDB不允许对寄存器变量进行解引用(dereference, but why?)。这时,设置变量set $p=*($esp),然后x $p就可以了。

这只是一个小小的不完全的总结,如果你从未使用过GDB,推荐使用RMS的《Debugging with GDB》学习,还有一本小书《GDB Pocket Reference》,不妨做你的调试菜谱,如果你喜欢GDB的话。

从CERT.RSA中提取证书

AndroidMETA-INFX509keytool

目录(?)[+]

原文链接:http://www.wangchen.org/2011/01/%E4%BB%8Ecert-rsa%E4%B8%AD%E6%8F%90%E5%8F%96%E8%AF%81%E4%B9%A6/

 

Apk 包中的META-INF目录下,有一个CERT.RSA,它是一个PKCS7 格式的文件。

下面介绍几种从中获取证书的方法。

Linux command line

[plain] view plaincopy

  1. openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text

你可以得到一个文本输出:

 

[plain] view plaincopy

  1. Certificate:
  2.     Data:
  3.         Version: 3 (0x2)
  4.         Serial Number: 1281971851 (0x4c69568b)
  5.         Signature Algorithm: sha1WithRSAEncryption
  6.         Issuer: CN=Michael Liu
  7.         Validity
  8.             Not Before: Aug 16 15:17:31 2010 GMT
  9.             Not After : Aug 10 15:17:31 2035 GMT
  10.         Subject: CN=Michael Liu
  11.         Subject Public Key Info:
  12.             Public Key Algorithm: rsaEncryption
  13.             RSA Public Key: (1024 bit)
  14.                 Modulus (1024 bit):
  15.                     00:8d:04:84:a2:1e:c6:56:39:f2:cd:a6:f0:48:a5:
  16.                     f7:5e:71:8f:e1:a8:af:a7:dc:66:92:a2:b9:cf:da:
  17.                     0f:32:42:ce:83:fe:bc:e1:4f:0a:fd:d9:a8:b3:73:
  18.                     f4:ff:97:15:17:87:d6:d0:3c:da:01:fc:11:40:7d:
  19.                     04:da:31:cc:cd:da:d0:e7:7b:e3:c1:84:30:9f:21:
  20.                     93:95:20:48:b1:2d:24:02:d2:b9:3c:87:0d:fa:b8:
  21.                     e1:b1:45:f4:8d:90:0a:3b:9d:d8:8a:9a:96:d1:51:
  22.                     23:0e:8e:c4:09:68:7d:95:be:c6:42:e9:54:a1:5c:
  23.                     5d:3f:25:d8:5c:c3:42:73:21
  24.                 Exponent: 65537 (0x10001)
  25.     Signature Algorithm: sha1WithRSAEncryption
  26.         78:3c:6b:ef:71:70:55:68:28:80:4d:f8:b5:cd:83:a9:01:21:
  27.         2a:c1:e4:96:ad:bc:5f:67:0c:cd:c3:34:51:6d:63:90:a9:f9:
  28.         d5:5e:c7:ef:34:43:86:7d:68:e1:99:87:92:86:34:91:6d:67:
  29.         6d:b2:22:e9:5e:28:aa:e8:05:52:04:6e:4e:d4:7f:0f:b0:d6:
  30.         28:f5:2b:11:38:d5:15:cb:e3:e4:c9:99:23:c1:84:4f:ce:69:
  31.         e9:b1:59:7b:8e:30:01:1c:e1:92:ee:0d:54:61:29:f5:8e:9e:
  32.         42:72:26:2b:aa:c7:af:d9:c9:d1:85:95:8e:4c:8d:5c:77:c5:
  33.         ce:4e

 

Java

这是最简单的

 

  1. import sun.security.pkcs.PKCS7;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.security.cert.CertificateException;
  5. import java.security.cert.X509Certificate;
  6. public class Test {
  7.     public static void main(String[] args) throws CertificateException, IOException {
  8.         FileInputStream fis = new FileInputStream(“/Users/wangchen/Desktop/CERT.RSA”);
  9.         PKCS7 pkcs7 = new PKCS7(fis);
  10.         X509Certificate publicKey = pkcs7.getCertificates()[0];
  11.         System.out.println(“issuer1:” + publicKey.getIssuerDN());
  12.         System.out.println(“subject2:” + publicKey.getSubjectDN());
  13.         System.out.println(publicKey.getPublicKey());
  14.     }
  15. }

 

使用openssl-dev 的C API

  1. #include <openssl/bio.h>
  2. #include <openssl/x509.h>
  3. #include <openssl/pkcs7.h>
  4. #include <string>
  5. #include <iostream>
  6. using namespace std;
  7. string to_string(X509_NAME* name)
  8. {
  9.     BIO* mem = BIO_new(BIO_s_mem());
  10.     if (mem == NULL)
  11.         return NULL;
  12.     if (X509_NAME_print_ex(mem, name, 0, XN_FLAG_RFC2253) < 0)         return NULL;     string str;     char buf[128];     while((BIO_gets(mem, &buf[0], sizeof(buf))) > 0)
  13.     {
  14.         str.append(buf);
  15.     }
  16.     BIO_free(mem);
  17.     return str;
  18. }
  19. int main()
  20. {
  21.     FILE* fp;
  22.     if (!(fp = fopen(“CERT.RSA”, “rb”)))
  23.     {
  24.         fprintf(stderr, “Error reading input pkcs7 file\n” );
  25.         exit(1);
  26.     }
  27.     /* todo: 这里可能有内存漏洞,有空查一下文档 */
  28.     PKCS7* pkcs7 = d2i_PKCS7_fp(fp, NULL);
  29.     X509* cert = sk_X509_pop(pkcs7->d.sign->cert);
  30.     string subject = to_string(X509_get_subject_name(cert));
  31.     string issuer = to_string(X509_get_issuer_name(cert));
  32.     char *modulus = BN_bn2dec(X509_get_pubkey(cert)->pkey.rsa->n);
  33.     cout << subject << endl;
  34.     OPENSSL_free(modulus);
  35.     fclose(fp);
  36.     return 0;
  37. }

Python

我没在Python 2.x 的OpenSSL 库中找到从PKCS7中提取证书的方法……
看来无奈时刻只能自己做Binding了。