SCO UNIX
到
RED HAT LINUX
的程序移植
最近一个项目要求把一个原先运行在
SCO UNIX
操作系统的柜面系统移植到
Red Hat Linux AS 3
平台上。现在好像有一个趋势,金融行业的的原先运行在
SCO
下的系统都准备迁移到
LINUX
下。
下面简要整理一下,迁移过程中的一些心得体会。
一、
SCO
的
cc
与
LINUX
的
gcc
的一些差别
总的来说,
linux
的
gcc
编译器相对
sco
下的
cc
要严格许多。通过这次移植发现
SCO
的
cc
对程序的要求实在不怎么严谨。举个例子,比如
strcpy()
函数应该是
2
个函数,如果你给他
3
个参数,编译也能通过。还有,如果一个函数的参数应该是传值,你给它传一个地址,
cc
也不会报错。
SCO
的
cc
与
linux
的
gcc
在有关空指针的处理上的差别是最明显的。比如,
strcpy(),strncpy(),strcmp(),strncmp(),fclose()
。在
SCO
上,如果参数有一个是空指针,程序不会
core
,但在
LINUX
下,这些函数只要有一个是空指针,程序运行过程中就会
core
。在移植过程中,我们发现只要程序运行过程中出现
core
,十有八九是因为空指针的问题。
因此,移植的第一步,我么就对上述常见的字符串操作函数,做了一层封装,然后用封装过的函数来全局替换原来的函数。
二、
gdb
的使用
由于以前没在
liunx
下写过程序,对
gdb
调试工具也没有使用过。这次移植还学会了
gdb
的一些基本调试步骤。
gdb
可执行程序
b
设置断点
r
运行程序
c
端点后重新运行程序
n
执行下一条语句
s
进入到函数体内调试(相对于
n
)
attach PID
调试正在运行的程序
三、关于
core
文件
在
SCO
下,一般程序
core
时,都会在可执行目录下生成一个
core
文件,我们可以使用
dbx
来查看程序的什么地方出现了
core
。
移植到
LINUX
下,一开始,程序
core
时,怎么都没有生成
core
文件。后来,才发现,需要人为设定
core
文件所允许的最大值。如果没有设定,默认是
0
,也就不会生成
core
文件。
设定方法如下:
执行
ulimit -c 102400
,可以把这个命令放在用户的登录
shell
里面,这样不用每次登录时重新设置了。
使用
“
gdb
可执行程序名
core
文件名”可以查看大致在什么地方程序出现
core
。