Qt 5.5.1 动态编译(MinGW) 支持OpenSSL ICU WebKit x86 x86-64

ICU:icu4c-56_1-src.zip

x86:http://pan.baidu.com/s/1jG6g7xO
x86-64:http://pan.baidu.com/s/1eQjofp4

OpenSSL:openssl-1.0.2d.tar.gz

x86:http://pan.baidu.com/s/1hqxxeWs
x86-64:http://pan.baidu.com/s/1c0maaMs

MinGW版本:MinGW32-64 5.1.0

x86:http://pan.baidu.com/s/1jG2IJiA
x86-64:http://pan.baidu.com/s/1eQi8hqi

x86 Qt库,包含Debug、Release、开发文档;
x86-64 Qt库,包含Release;

x86:http://pan.baidu.com/s/1yVnVS
x86-64:http://pan.baidu.com/s/1mgnL9Bq

x86 Configure:
Running configuration tests...
Environment:
INCLUDE=
Unset
LIB=
Unset
PATH=
C:\Perl64\site\bin
C:\Perl64\bin
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\
C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0\
C:\Program Files\Microsoft SQL Server\120\Tools\Binn\
C:\Program Files\TortoiseSVN\bin
C:\Program Files (x86)\Skype\Phone\
C:\Users\Binnan_Hao_XPS15\AppData\Local\Programs\Python\Python35\Scripts\
C:\Users\Binnan_Hao_XPS15\AppData\Local\Programs\Python\Python35\
C:\Ruby22-x64\bin
C:\Program Files\7-Zip
D:\icu_x86\bin
D:\icu_x86\lib
D:\openssl_x86\bin
D:\openssl_x86\lib
E:\mingw-w64\i686-5.1.0-posix-dwarf-rt_v4-rev0\mingw32\bin
D:\x86\qt-everywhere-opensource-src-5.5.1\gnuwin32\bin
Configuration:
pcre
debug
Qt Configuration:
minimal-config
small-config
medium-config
large-config
full-config
debug_and_release build_all release
debug
c++11
shared
system-zlib
icu
png
freetype
harfbuzz
build_all
accessibility
opengl
openssl-linked
audio-backend
native-gestures
qpa
iconv
concurrent

QMAKESPEC...................win32-g++ (detected)
Architecture................i386, features:
Host Architecture...........i386, features:
Maketool....................mingw32-make
Debug build.................yes (combined)
Default build...............debug
Force debug info............no
C++11 support...............yes
Link Time Code Generation...no
Accessibility support.......yes
RTTI support................yes
SSE2 support................yes
SSE3 support................yes
SSSE3 support...............yes
SSE4.1 support..............yes
SSE4.2 support..............yes
AVX support.................yes
AVX2 support................yes
NEON support................no
OpenGL support..............yes
Large File support..........yes
NIS support.................no
Iconv support...............yes
Evdev support...............no
Mtdev support...............no
Inotify support.............no
eventfd(7) support..........no
Glib support................no
CUPS support................no
OpenVG support..............no
SSL support.................linked
OpenSSL support.............linked
libproxy support............no
Qt D-Bus support............no
Qt Widgets module support...yes
Qt GUI module support.......yes
QML debugging...............yes
DirectWrite support.........no
Use system proxies..........no

QPA Backends:
GDI.....................yes
Direct2D................no

Third Party Libraries:
ZLIB support............system
GIF support.............plugin
JPEG support............plugin
PNG support.............yes
FreeType support........yes
Fontconfig support......no
HarfBuzz support........qt
PCRE support............qt
ICU support.............yes
ANGLE...................no
Dynamic OpenGL..........no

Styles:
Windows.................yes
Windows XP..............yes
Windows Vista...........yes
Fusion..................yes
Windows CE..............no
Windows Mobile..........no

Sql Drivers:
ODBC....................no
MySQL...................no
OCI.....................no
PostgreSQL..............no
TDS.....................no
DB2.....................no
SQLite..................plugin (qt)
SQLite2.................no
InterBase...............no

Sources are in..............D:\x86\qt-everywhere-opensource-src-5.5.1\qtbase
Build is done in............D:\x86\qt-everywhere-opensource-src-5.5.1\qtbase
Install prefix..............D:\QtLibrary-x86
Headers installed to........D:\QtLibrary-x86\include
Libraries installed to......D:\QtLibrary-x86\lib
Arch-dep. data to...........D:\QtLibrary-x86
Plugins installed to........D:\QtLibrary-x86\plugins
Library execs installed to..D:\QtLibrary-x86\bin
QML1 imports installed to...D:\QtLibrary-x86\imports
QML2 imports installed to...D:\QtLibrary-x86\qml
Binaries installed to.......D:\QtLibrary-x86\bin
Arch-indep. data to.........D:\QtLibrary-x86
Docs installed to...........D:\QtLibrary-x86\doc
Translations installed to...D:\QtLibrary-x86\translations
Examples installed to.......D:\QtLibrary-x86\examples
Tests installed to..........D:\QtLibrary-x86\tests
Include paths...............D:\openssl_x86\include D:\icu_x86\include
Additional libraries........-LD:\openssl_x86\lib -LD:\openssl_x86\bin -LD:\icu_x86\lib -LD:\icu_x86\bin

Info: creating super cache file D:\x86\qt-everywhere-opensource-src-5.5.1\.qmake.super

x86-64 Configure:
Running configuration tests...
Environment:
INCLUDE=
Unset
LIB=
Unset
PATH=
C:\Perl64\site\bin
C:\Perl64\bin
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\
C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0\
C:\Program Files\Microsoft SQL Server\120\Tools\Binn\
C:\Program Files\TortoiseSVN\bin
C:\Program Files (x86)\Skype\Phone\
C:\Users\Binnan_Hao_XPS15\AppData\Local\Programs\Python\Python35\Scripts\
C:\Users\Binnan_Hao_XPS15\AppData\Local\Programs\Python\Python35\
C:\Ruby22-x64\bin
C:\Program Files\7-Zip
D:\icu_x86-64\bin
D:\icu_x86-64\lib
D:\openssl_x86-64\bin
D:\openssl_x86-64\lib
E:\mingw-w64\x86_64-5.1.0-posix-seh-rt_v4-rev0\mingw64\bin
D:\x86-64\qt-everywhere-opensource-src-5.5.1\gnuwin32\bin
Configuration:
pcre
release
Qt Configuration:
minimal-config
small-config
medium-config
large-config
full-config
release
c++11
shared
system-zlib
icu
png
freetype
harfbuzz
accessibility
opengl
openssl-linked
audio-backend
native-gestures
qpa
iconv
concurrent

QMAKESPEC...................win32-g++ (detected)
Architecture................x86_64, features: cx16 mmx sse sse2 sse3
Host Architecture...........x86_64, features: cx16 mmx sse sse2 sse3
Maketool....................mingw32-make
Debug.......................no
Force debug info............no
C++11 support...............yes
Link Time Code Generation...no
Accessibility support.......yes
RTTI support................yes
SSE2 support................yes
SSE3 support................yes
SSSE3 support...............yes
SSE4.1 support..............yes
SSE4.2 support..............yes
AVX support.................yes
AVX2 support................yes
NEON support................no
OpenGL support..............yes
Large File support..........yes
NIS support.................no
Iconv support...............yes
Evdev support...............no
Mtdev support...............no
Inotify support.............no
eventfd(7) support..........no
Glib support................no
CUPS support................no
OpenVG support..............no
SSL support.................linked
OpenSSL support.............linked
libproxy support............no
Qt D-Bus support............no
Qt Widgets module support...yes
Qt GUI module support.......yes
QML debugging...............yes
DirectWrite support.........no
Use system proxies..........no

QPA Backends:
GDI.....................yes
Direct2D................no

Third Party Libraries:
ZLIB support............system
GIF support.............plugin
JPEG support............plugin
PNG support.............yes
FreeType support........yes
Fontconfig support......no
HarfBuzz support........qt
PCRE support............qt
ICU support.............yes
ANGLE...................no
Dynamic OpenGL..........no

Styles:
Windows.................yes
Windows XP..............yes
Windows Vista...........yes
Fusion..................yes
Windows CE..............no
Windows Mobile..........no

Sql Drivers:
ODBC....................no
MySQL...................no
OCI.....................no
PostgreSQL..............no
TDS.....................no
DB2.....................no
SQLite..................plugin (qt)
SQLite2.................no
InterBase...............no

Sources are in..............D:\x86-64\qt-everywhere-opensource-src-5.5.1\qtbase
Build is done in............D:\x86-64\qt-everywhere-opensource-src-5.5.1\qtbase
Install prefix..............D:\QtLibrary-x86-64
Headers installed to........D:\QtLibrary-x86-64\include
Libraries installed to......D:\QtLibrary-x86-64\lib
Arch-dep. data to...........D:\QtLibrary-x86-64
Plugins installed to........D:\QtLibrary-x86-64\plugins
Library execs installed to..D:\QtLibrary-x86-64\bin
QML1 imports installed to...D:\QtLibrary-x86-64\imports
QML2 imports installed to...D:\QtLibrary-x86-64\qml
Binaries installed to.......D:\QtLibrary-x86-64\bin
Arch-indep. data to.........D:\QtLibrary-x86-64
Docs installed to...........D:\QtLibrary-x86-64\doc
Translations installed to...D:\QtLibrary-x86-64\translations
Examples installed to.......D:\QtLibrary-x86-64\examples
Tests installed to..........D:\QtLibrary-x86-64\tests
Include paths...............D:\openssl_x86-64\include D:\icu_x86-64\include
Additional libraries........-LD:\openssl_x86-64\lib -LD:\openssl_x86-64\bin -LD:\icu_x86-64\lib -LD:\icu_x86-64\bin

Info: creating super cache file D:\x86-64\qt-everywhere-opensource-src-5.5.1\.qmake.super

chroot用法详解

CHROOT就是Change Root,也就是改变程式执行时所参考的根目录位置。

一般的目录架构:
/
/bin
/sbin
/usr/bin
/home

CHROOT的目录架构:
/hell/
/hell/bin
/hell/usr/bin
/hell/home
* 为何要CHROOT?

1.限制被CHROOT的使用者所能执行的程式,如SetUid的程式,或是会造成Load 的 Compiler等等。
2.防止使用者存取某些特定档案,如/etc/passwd。
3.防止入侵者/bin/rm -rf /。
4.提供Guest服务以及处罚不乖的使用者。
5.增进系统的安全。

* 要如何建立CHROOT的环境?
1.chroot()这个function:
chroot(PATH)这个function必须具有 root 的身份才能执行,执行後会将根目录切换到 PATH所指定的地方。
2.login的过程:
使用者无论是从console或是telnet进入,都必须执行/usr/bin/login来
决定是否能进入系统,而login所做的动作大致是:
(1)印出login的提示符号,等待使用者输入密码。
(2)检查密码是否正确,错误的话回到(1)。
(3)正确的话以setuid()来改变身份为login_user。
(4)以exec()执行user的shell。
因此我们必须先修改/usr/bin/login的source code,让login在(2)到(3)
的中间执行chroot($CHROOT_PATH)的动作,已达到CHROOT的目的,并以修
改过的login替代原先的/usr/bin/login。
(5)稍微好一点的方法必须在做chroot()之前检查login
user的group,如果有某个特定的group(如chrootgrp)
才执行chroot(),不然所有的人都会被chroot了。

3.建立CHROOT所需的环境:
(1)必须具备的目录:(假设$CHROOT为希望建立的路径)
$CHROOT/etc $CHROOT/lib $CHROOT/bin
$CHROOT/sbin $CHROOT/usr/lib $CHROOT/usr/bin
$CHROOT/usr/bin $CHROOT/usr/local $CHROOT/home
(2)仔细审查/etc中的档案,需具备执行程式时所需的档
案,如passwd,groups,hosts,resolv.conf等等。
(3)拿掉不想给的执行档,如su,sudo等SetUid的程式,
以及compiler甚至telnet。
(4)测试一下,以root身份执行 chroot $CHROOT /bin/sh
即可进入CHROOT环境中。(man chroot for details)

4.在console或是以telnet进入试试。

5.Username/Password Resolve的考量:
在CHROOT时你可能不希望被CHROOT的使用者(以後简称CHROOTer)能拿到/etc/passwd或是/etc/shadow等档案,尤其是有root密码的。以下有三种情形:
(1)/etc/passwd跟 $CHROOT/etc/passwd相同:
这是最差的作法,因为一来被CHROOTer有机会得到root
的encrypted password,二来要保持/etc/passwd及
$CHROOT/etc/passwd的同步性是个大问题。因为
/usr/bin/login参考的是/etc/passwd,可是一旦
CHROOTer被chroot後执行passwd时,他所执行的
passwd所更改的将是$CHROOT/etc/passwd。
(2)/etc/passwd跟$CHROOT/etc/passwd不同:
你可以把$CHROOT/etc/passwd中的重要人物(如root)
的密码拿掉,然後以比较复杂的方法修改
/usr/bin/login:
if (has_chroot_group) {
re-load $CHROOT/etc/passwd
if (password is valid) {
chroot($CHROOT)
exec(shell)
} else logout()
}
此法的好处是你可以将/etc/passwd跟
$CHROOT/etc/passwd分开来。/etc/passwd只影响
CHROOTer在login时所使用的username,其他如
password甚至uid,gid,shell,home等等都是参
考$CHROOT/etc/passwd的。
缺点是你其他的daemon如ftpd,httpd都必须做相同
的修改才能正确取的CHROOTer的资讯,而且你在把一
个user加入或移出chroot_group时都必须更改
/etc/passwd跟$CHROOT/etc/passwd。

(3)使用NIS/YP:
此法大概是最简单,且麻烦最少的了。因为一切的user
information都经过NIS Bind来取得,不但可以保护住
root的密码,也省去/etc/passwd跟
$CHROOT/etc/passwd同步管理上的问题。不只是
passwd,连其他如groups,hosts,services,
aliases等等都可以一并解决。

* 其他必须考虑的问题:
1.执行档的同步性:
再更新系统或是更新软体时,必须考虑到一并更换
$CHROOT目录下的档案,尤其如SunOS或是BSD等会用
nlist()来取得Kernel Information的,在更新kernel
时必须更新$CHROOT下的kernel。
2./dev的问题:
一般而言你必须用local loopback NFS将/dev read-write mount到$CHROOT/dev以使得一般user跟CHROOTer可以互相write以及解决devices同步性的问题。
3./proc的问题:
在Linux或是SYSV或是4.4BSD的系统上许多程式会去
参考/proc的资料,你必须也将/proc mount到
$CHROOT/proc。
4./var的问题:
一般而言/var也是用local loopback NFS read-write
mount到$CHROOT/var下,以解决spool同步性的问题,
否则你可能必须要修改lpd或是sendmail等daemon,
不然他们是不知道$CHROOT/var下也有spool的存在。
5.Daemon的问题:
你必须修改一些跟使用者相关的Daemon如ftpd,httpd
以使这些daemon能找到正确的user home。

* CHROOT无法解决的安全问题:
1.不小心或是忘记拿掉SetUid的程式:
CHROOTer还是有机会利用SetUid的程式来取得root的
权限,不过因为你已经将他CHROOT了,所以所能影响到
的只有$CHROOT/目录以下的档案,就算他来个
"/bin/rm -rf /" 也不怕了。
不过其他root能做的事还是防不了,如利用tcpdump来
窃听该localnet中的通讯并取得在该localnet上其他
机器的帐号密码,reboot机器,更改NIS的资料,更改
其他没有被CHROOT的帐号的密码藉以取得一般帐号(所
以root不可加入NIS中)等等。
(此时就必须藉由securetty或是login.access或是将
wheel group拿出NIS来防止其login as root)
2.已载入记忆体中的Daemon:
对於那些一开机就执行的程式如sendmail,httpd,
gopherd,inetd等等,如果这些daemon有hole(如
sendmail),那hacker只要破解这些daemon还是可以取
得root权限。

* 结论:
CHROOT可以增进系统的安全性,限制使用者能做的事,
但是CHROOT Is Not Everything,因为还是有其他的
漏洞等著hacker来找出来。

使用OpenSSL库实现RSA、AES数据加密与解密

openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密。可以使用非对称加密:公钥加密,私钥解密。openssl提供了对RSA的支持,但RSA存在计算效率低的问题,所以一般的做法是使用对称密钥加密数据,然后再把这个只在当前有效的临时生成的对称密钥用非对称密钥的公钥加密之后传递给目标方,目标方使用约定好的非对称密钥中的私钥解开,得到数据加密的密钥,再进行数据解密,得到数据,这种使用方式很常见,可以认为是对HTTPS的裁剪。对称密钥加密可以选择AES,比DES更优秀。
openssl库来自http://www.openssl.org/,下载到openssl源码之后,开始编译:
产生动态库的做法:
1、安装ActivePerl
2、进入OpenSSL所在文件夹,运行:perl Configure VC-WIN32 --prefix=C:\openssl-dll
3、进入VC/BIN目录,运行 VCVARS32.BAT 设置环境变量
4、返回OpenSSL目录,运行 ms\do_ms
5、在OpenSSL目录下执行编译 nmake -f ms\ntdll.mak
6、把必要生成物拷贝到prefix定义的目录中 nmake -f ms\ntdll.mak install
注意:可以通过修改ntdll.mak文件中的CFLAG,确定编译MT、MD库
产生静态库的做法:
1、安装ActivePerl
2、perl configure VC-WIN32 --prefix=C:\openssl-lib
3、ms\do_ms.bat
4、nmake -f ms\nt.mak
5、nmake -f ms\nt.mak install
注意:可以通过修改nt.mak文件中的CFLAG,确定编译MT、MD库。重编的时候把生成物删掉。
RSA加解密需要先用openssl工具生成RSA公钥和RSA私钥。方法:
1、产生私钥:openssl genrsa -out privkey.pem 1024;
2、根据私钥产生公钥:openssl rsa -in privkey.pem -pubout。
1024只是测试用,使用2048位才比较安全。
RSA加密部分代码demo:

RSA解密部分代码demo:

RSA的API中当使用参数RSA_PKCS1_PADDING时,明文长度不能大于密文长度-11;当使用参数RSA_NO_PADDING时,明文长度需要正好是128。
AES加密部分代码:

AES解密部分代码:

AES加密,块大小必须为128位(16字节),如果不是,则要补齐,密钥长度可以选择128位、192位、256位。

使用Linux vmfs-tools来挂载访问VMFS文件磁盘

1.首先要安装unbuntu系统,X86或者X64都可以,版本必须是9.10或者以上版本,这里使用10.04 X64版本,具体安装不作赘述,安装完毕后记得要安装编译包,如下
sudo apt-get install build-essential

2.安装vmfs-tools
sudo apt-get install vmfs-tools
若无法使用apt-get安装也可以直接下载源文件编译安装,下载地址是http://glandium.org/projects/vmfs-tools/
make&&make install 就行了

3.挂载vmfs文件格式硬盘
www@linux ~$ sudo fdisk -l
Disk /dev/sdb: 160.0 GB, 160041885696 bytes 255 heads, 63 sectors/track, 19457 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x49e2fd2f Device Boot Start End Blocks Id System
/dev/sdb1 * 1 140 1124518+ 83 Linux
/dev/sdb2 141 154 112455 fc VMware VMKCORE
/dev/sdb3 155 19457 155051347+ f W95 Ext'd (LBA)
/dev/sdb5 155 19457 155051316 fb VMware VMFS
此处/dev/sdb5就是 vmfs文件格式的分区
www@linux ~$ sudo vmfs-fuse /dev/sdb5 /opt/vmfs
此命令即可挂载vmfs分区到/opt/vmfs上面使用cp命令即可成功复制出里面的文件了。

4.若要想了解更多关于vmfs-tools的信息可以参考如下
www@linux ~$ sudo apt-get install open-vm-source
OR
www@linux ~$ sudo apt-get install open-vm-tools

Linux下C语言的调试

调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 🙂 , 它提供了设置断点, 单步跟踪等的图形界面, 使调试起来直观易用. 但Linux用户可能要生闷气了 O:-) : 难道我们Linux程序员就只能使用原始的调试方法, 在代码中加入printf信息吗?难道Linux下就没有好的C语言调试工具吗?

当然不是了. GNU早就组织开发了一套C语言编译器(Gcc)和调试工具(Gdb). Gdb虽然没有图形化的友好界面, 但是它强大的功能也足以与微软的VC工具相媲美, 给Linux程序员带来了福音. 下面通过一个简单的例子, 演示一下Gdb的使用流程:

示例文件 demo.c 的源代码如下:

编译源文件, 生成可执行文件:

$ gcc -g -Wall -o demo demo.c
虽然这段程序没有错误, 但调试完全正确的程序可以更加了解Gdb的使用流程. 接下来就启动Gdb进行调试.

注意:

Gdb进行调试的是可执行文件, 而不是”.c”源文件, 因此, 需要先通过Gcc编译生成可执行文件才能用Gdb进行调试.
一定要加上选项”-g”, 这样编译出的可执行代码中才包含调试信息, 否则Gdb无法载入该可执行文件.
不能使用 -O2选项对可执行文件进行优化, 因为优化之后可执行文件里的符号表信息将被删除, 这样Gdb就无法找到使可执行文件与源文件之间的关联了, 也就不能调试了.

(1) 启动Gdb

$ gdb demo
GNU gdb (GDB) 7.0-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/wangsheng/tmp/demo/gdb/demo...done.
可以看出, 在Gdb的启动画面中指出了Gdb的版本号, 使用的库文件等头信息, 接下来就进入了由”(gdb)”开头的命令行界面了.

(2) 查看源文件

在Gdb中键入”l”(list的缩写)可以查看所载入的文件, 如下所示:

(gdb) l
1 #include
2
3 int sum(int, int);
4
5 int
6 main()
7 {
8 int result;
9 int a = 1, b = 2;
10 result = sum(a, b);
(gdb) l
11 printf("%d + %d = %d\n", a, b, result);
12 return 0;
13 }
14
15 int
16 sum(int a, int b)
17 {
18 return a + b;
19 }
(gdb) l
Line number 20 out of range; demo.c has 19 lines.
可以看出, Gdb列出的源代码中明确地给出了对应的行号, 这样就可以大大地方便代码的定位.

(3) 设置断点

设置断点是调试程序中一个非常重要的手段, 它可以使程序到一定位置暂停运行. 因此,可以在该位置方便地查看变量的值, 堆栈情况等, 从而找出代码的症结所在.

在Gdb中设置断点非常简单, 只需在”b”后加入对应的行号即可(这是最常用的方式). 如下所示:

(gdb) b 9
Breakpoint 2 at 0x4004f4: file demo.c, line 9.
注意: 该断点的作用是当程序运行到第 9 行时暂停(第 8 行执行完毕, 第 9 行未执行)

(4) 查看断点信息

(gdb) info b
Num Type Disp Enb Address What
2 breakpoint keep y 0x00000000004004f4 in main at demo.c:9

(5) 运行代码

接下来就可运行代码了, Gdb默认从首行开始运行代码, 可键入”r”(run的缩写)即可. 若想从程序中指定的行开始运行, 可在r后面加上行号.

(gdb) r
Starting program: /home/wangsheng/tmp/demo/gdb/demo

Breakpoint 2, main () at demo.c:9
9 int a = 1, b = 2;
可以看到程序运行到断点处就停止了.

(6) 查看变量值

键入p(print的缩写)+变量名即可查看该变量在此时的值

(gdb) p a
$1 = 1
(gdb) p b
$2 = 2
(gdb) p result
$3 = 32767
注意: 这里之所以result是一个莫名其妙的值, 是因为声明result是没有初始化, 其值是不固定的。

(7) 单步执行

单步运行可以使用n(next的缩写)或者s(step的缩写), 它们之间的区别在于: 若有函数调用的时候, s会进入该函数而n不会. 因此, s就类似于VC等工具中的”step in”, n就类似于VC等工具中的”step over”.

如果使用n命令显示如下:

(gdb) n
10 result = sum(a, b);
下面使用 s 命令,跟踪进入 sum 函数:

(gdb) s
sum (a=1, b=2) at demo.c:18
18 return a + b;
可以看出执行 s 命令时进入了sum函数内部, 如果用 n 命令则跳过函数的调用部分

(8) 恢复程序运行

在查看变量值以及堆栈之后, 就可以使用命令c(continue)恢复程序的正常运行了. 这时, 它会把剩余还未执行的程序执行完, 并显示剩余程序的执行结果.

(gdb) c
Continuing.
1 + 2 = 3

Program exited normally.
可以看出, 程序在运行完后退出, 之后程序处于”停止状态”.
说明: 在Gdb中, 程序的运行状态有”运行”,”暂停”和”停止”3种. 其中”暂停”状态是程序遇到了断点或者观察点, 程序暂时停止运行, 而此时函数的地址, 函数参数, 函数内的局部变量都会被压入”栈(Stack)中. 故在这种状态下可以查看函数的变量值等各种属性. 但在函数处于”停止”状态之后, “栈”就会自动撤销, 它也就无法查看各种信息了

关于Gdb的更多命令, 你可以在启用Gdb后, 输入help命令查看.