GDB调试精粹及使用实例(收藏)

                                   

一:列文件清单
1. List
(gdb) list line1,line2

二:执行程序
要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符()和外壳通配符(*、?、[、])在内。
如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。
利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。
gdb)set args –b –x
(gdb) show args
backtrace命令为堆栈提供向后跟踪功能。
Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。

三:显示数据
利用print 命令可以检查各个变量的值。
(gdb) print p (p为变量名)
whatis 命令可以显示某个变量的类型
(gdb) whatis p
type = int *

print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:
l 对程序中函数的调用
(gdb) print find_entry(1,0)
l 数据结构和其他复杂对象
(gdb) print *table_start
$8={e=reference=’00’,location=0x0,next=0x0}
l 值的历史成分
(gdb)print $1 ($1为历史记录变量,在以后可以直接引用 $1 的值)
l 人为数组
人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示:
base@length
因此,要想显示在h后面的10个元素,可以使用h@10:
(gdb)print h@10
$13=(-1,345,23,-234,0,0,0,98,345,10)

四:断点(breakpoint)
break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:
l break line-number 使程序恰好在执行给定行之前停止。
l break function-name 使程序恰好在进入指定的函数之前停止。
l break line-or-function if condition 如果condition(条件)是真,程序到达指定行或函数时停止。
l break routine-name 在指定例程的入口处设置断点

如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:
(gdb) break filename:line-number
(gdb) break filename:function-name

要想设置一个条件断点,可以利用break if命令,如下所示:
(gdb) break line-or-function if expr
例:
(gdb) break 46 if testsize==100

从断点继续运行:countinue 命令
五.断点的管理

1. 显示当前gdb的断点信息:
(gdb) info break
他会以如下的形式显示所有的断点信息:
Num Type Disp Enb Address What
1 breakpoint keep y 0x000028bc in init_random at qsort2.c:155
2 breakpoint keep y 0x0000291c in init_organ at qsort2.c:168
(gdb)
2.删除指定的某个断点:
(gdb) delete breakpoint 1
该命令将会删除编号为1的断点,如果不带编号参数,将删除所有的断点
(gdb) delete breakpoint
3.禁止使用某个断点
(gdb) disable breakpoint 1
该命令将禁止断点 1,同时断点信息的 (Enb)域将变为 n
4.允许使用某个断点
(gdb) enable breakpoint 1
该命令将允许断点 1,同时断点信息的 (Enb)域将变为 y
5.清除原文件中某一代码行上的所有断点
(gdb)clean number
注:number 为原文件的某个代码行的行号
六.变量的检查和赋值
l whatis:识别数组或变量的类型
l ptype:比whatis的功能更强,他可以提供一个结构的定义
l set variable:将值赋予变量
l print 除了显示一个变量的值外,还可以用来赋值

七.单步执行
l next
不进入的单步执行
l step
进入的单步执行
如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish
八.函数的调用
l call name 调用和执行一个函数
(gdb) call gen_and_sork( 1234,1,0 )
(gdb) call printf(“abcd”)
$1=4
l finish 结束执行当前函数,显示其返回值(如果有的话)

九.机器语言工具
有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器,gdb提供了目前每一台计算机中实际使用的4个寄存器的标准名字:
l $pc : 程序计数器
l $fp : 帧指针(当前堆栈帧)
l $sp : 栈指针
l $ps : 处理器状态

十.信号
gdb通常可以捕捉到发送给它的大多数信号,通过捕捉信号,它就可决定对于正在运行的进程要做些什么工作。例如,按CTRL-C将中断信号发送给gdb,通常就会终止gdb。但是你或许不想中断gdb,真正的目的是要中断gdb正在运行的程序,因此,gdb要抓住该信号并停止它正在运行的程序,这样就可以执行某些调试操作。

Handle命令可控制信号的处理,他有两个参数,一个是信号名,另一个是接受到信号时该作什么。几种可能的参数是:
l nostop 接收到信号时,不要将它发送给程序,也不要停止程序。
l stop 接受到信号时停止程序的执行,从而允许程序调试;显示一条表示已接受到信号的消息(禁止使用消息除外)
l print 接受到信号时显示一条消息
l noprint 接受到信号时不要显示消息(而且隐含着不停止程序运行)
l pass 将信号发送给程序,从而允许你的程序去处理它、停止运行或采取别的动作。
l nopass 停止程序运行,但不要将信号发送给程序。
例如,假定你截获SIGPIPE信号,以防止正在调试的程序接受到该信号,而且只要该信号一到达,就要求该程序停止,并通知你。要完成这一任务,可利用如下命令:
(gdb) handle SIGPIPE stop print
请注意,UNIX的信号名总是采用大写字母!你可以用信号编号替代信号名
如果你的程序要执行任何信号处理操作,就需要能够测试其信号处理程序,为此,就需要一种能将信号发送给程序的简便方法,这就是signal命令的任务。该 命令的参数是一个数字或者一个名字,如SIGINT。假定你的程序已将一个专用的SIGINT(键盘输入,或CTRL-C;信号2)信号处理程序设置成采 取某个清理动作,要想测试该信号处理程序,你可以设置一个断点并使用如下命令:
gdb) signal 2
continuing with signal SIGINT(2)
该程序继续执行,但是立即传输该信号,而且处理程序开始运行.

十一. 原文件的搜索
search text:该命令可显示在当前文件中包含text串的下一行。
Reverse-search text:该命令可以显示包含text 的前一行。

十二.UNIX接口
shell 命令可启动UNIX外壳,CTRL-D退出外壳,返回到 gdb.

十三.命令的历史
为了允许使用历史命令,可使用 set history expansion on 命令
(gdb) set history expansion on

小结:常用的gdb命令
backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)
breakpoint 在程序中设置一个断点
cd 改变当前工作目录
clear 删除刚才停止处的断点
commands 命中断点时,列出将要执行的命令
continue 从断点开始继续执行
delete 删除一个断点或监测点;也可与其他命令一起使用
display 程序停止时显示变量和表达时
down 下移栈帧,使得另一个函数成为当前函数
frame 选择下一条continue命令的帧
info 显示与该程序有关的各种信息
jump 在源程序中的另一点开始运行
kill 异常终止在gdb 控制下运行的程序
list 列出相应于正在执行的程序的原文件内容
next 执行下一个源程序行,从而执行其整体中的一个函数
print 显示变量或表达式的值
pwd 显示当前工作目录
pype 显示一个数据结构(如一个结构或C++类)的内容
quit 退出gdb
reverse-search 在源文件中反向搜索正规表达式
run 执行该程序
search 在源文件中搜索正规表达式
set variable 给变量赋值
signal 将一个信号发送到正在运行的进程
step 执行下一个源程序行,必要时进入下一个函数
undisplay display命令的反命令,不要显示表达式
until 结束当前循环
up 上移栈帧,使另一函数成为当前函数
watch 在程序中设置一个监测点(即数据断点)
whatis 显示变量或函数类型
****************************************************
 GNU的调试器称为gdb,该程序是一个交互式工具,工作在字符模式。在 X Window 系统中,有一个gdb的前端图形工具,称为xxgdb。gdb 是功能强大的调试程序,可完成如下的调试任务: 
  * 设置断点; 
  * 监视程序变量的值; 
  * 程序的单步执行; 
  * 修改变量的值。 
  在可以使用 gdb 调试程序之前,必须使用 -g 选项编译源文件。可在 makefile 中如下定义 CFLAGS 变量: 
   CFLAGS = -g 
   运行 gdb 调试程序时通常使用如下的命令: 
   gdb progname 

  在 gdb 提示符处键入help,将列出命令的分类,主要的分类有: 
  * aliases:命令别名 
  * breakpoints:断点定义; 
  * data:数据查看; 
  * files:指定并查看文件; 
  * internals:维护命令; 
  * running:程序执行; 
  * stack:调用栈查看; 
  * statu:状态查看; 
  * tracepoints:跟踪程序执行。 
  键入 help 后跟命令的分类名,可获得该类命令的详细清单。 

gdb 的常用命令 
命令 解释 
  break NUM 在指定的行上设置断点。 
  bt 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。 
  clear 删除设置在特定源文件、特定行上的断点。其用法为clear FILENAME:NUM 
  continue 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而 导致停止运行时。 
  display EXPR 每次程序停止后显示表达式的值。表达式由程序定义的变量组成。 
  file FILE 装载指定的可执行文件进行调试。 
  help NAME 显示指定命令的帮助信息。 
  info break 显示当前断点清单,包括到达断点处的次数等。 
  info files 显示被调试文件的详细信息。 
  info func 显示所有的函数名称。 
  info local 显示当函数中的局部变量信息。 
  info prog 显示被调试程序的执行状态。 
  info var 显示所有的全局和静态变量名称。 
  kill 终止正被调试的程序。 
  list 显示源代码段。 
  make 在不退出 gdb 的情况下运行 make 工具。 
  next 在不单步执行进入其他函数的情况下,向前执行一行源代码。 
  print EXPR 显示表达式 EXPR 的值。 

******gdb 使用范例************************ 
—————– 
清单 一个有错误的 C 源程序 bugging.c 
代码: 

—————– 
1 #include  

3 static char buff [256]; 
4 static char* string; 
5 int main () 
6 { 
7   printf (“Please input a string: “); 
8   gets (string);   
9   printf (“nYour string is: %sn”, string); 
10 } 
 

—————– 
  上面这个程序非常简单,其目的是接受用户的输入,然后将用户的输入打印出来。该程序使用了一个未经过初始化的字符串地址  string,因此,编译并运行之后,将出现 Segment Fault 错误: 
$ gcc -o bugging -g bugging.c 
$ ./bugging 
Please input a string: asfd 
Segmentation fault (core dumped) 
为了查找该程序中出现的问题,我们利用 gdb,并按如下的步骤进行: 
1.运行 gdb bugging 命令,装入 bugging 可执行文件; 
2.执行装入的 bugging 命令 run; 
3.使用 where 命令查看程序出错的地方; 
4.利用 list 命令查看调用 gets 函数附近的代码; 
5.唯一能够导致 gets 函数出错的因素就是变量 string。用print命令查看 string 的值; 
6.在 gdb 中,我们可以直接修改变量的值,只要将 string 取一个合法的指针值就可以了,为此,我们在第8行处设置断点 break 8; 
7.程序重新运行到第 8行处停止,这时,我们可以用 set variable 命令修改 string 的取值; 
8.然后继续运行,将看到正确的程序运行结果。

GDB轻松调试 (Zz)

一、引言
在了解GDB可以做什么,怎么做之前,让我们先来看看为什么要用GDB,或者说对调试工具有什么期望。

一般我们使用GDB(或其他调试工具)是为了发现程序bug,更经常地是在已知程序有错的情况下定位bug。既然这样,我们就需要跟踪程序的执行情况,查看程序执行是否正常,当然这就需要有个让我们与执行程序交互的环境,调试工具提供一个能让程序在你的掌控下执行,并让你能够查看一些执行过程中的“内幕信息”的环境。

为了查看程序运行过程中的状态,我们就希望程序能在适当的位置或者在一定的条件下能够暂停运行;为此,调试工具提供了断点、查看变量/表达式、显示程序栈等功能。看了某个点的“内幕”后,我们还期望更多,所以要能控制程序运行才行,这就要求断点、继续运行、单步(多步)运行、进入函数运行等功能,在某些情况下,还需要通过修改当前的执行环境(变量等)来达到期望的执行顺序。也就是说,光看着是不够的,还需要能改才行。

理解了这些问题后,我们就明白GDB的各个功能的用意了,自然也就明白该如何使用调试工具了。当然,要让GDB有效的发挥作用,还是需要一定的经验与技巧,而这主要靠实践,学习资料(包括本文)充其量只能帮你一把(小心别让它帮倒忙)。

总而言之,我们首先要明白使用调试工具的目的和用意,才能理解它的各项功能,才能借助它快速有效的发现问题;否则,即使工具再强大,你也不知道该如何使用才好。

另外要多结合使用代码检视、运行日志、测试工具等方法来发现潜在的问题,提供程序的质量。这些问题将在另文探讨,先做个广告。
 
 
二、GDB能做什么
GDB可以用来调试C、C++、Modula-2的程序。一般来说,GDB能做的事大致可以分为四类:

1、启动程序,按指定的方式执行程序。
2、在指定条件下使程序暂停.
3、当程序被停住时,可以检查此时你的程序中的变化。
4、改变程序中的变量或执行顺序来试验。
 
 
三、GDB使用概述
首先要了解的是gdb的help命令,因为你可能记不住各个命令的语法和用途,但只要能正确使用help命令,你就不需要任何其它的gdb资料。

启动gdb后,输入help

[eric@linux eric]$ gdb
GNU gdb Red Hat Linux (5.3.90-0.20030710.40rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “i386-redhat-linux-gnu”.
(gdb) help
List of classes of commands:

aliases — Aliases of other commands
breakpoints — Making program stop at certain points
data — Examining data
files — Specifying and examining files
internals — Maintenance commands
obscure — Obscure features
running — Running the program
stack — Examining the stack
status — Status inquiries
support — Support facilities
tracepoints — Tracing of program execution without stopping the program
user-defined — User-defined commands

Type “help” followed by a class name for a list of commands in that class.
Type “help” followed by command name for full documentation.
Command name abbreviations are allowed if unambiguous.
(gdb)
如上文显示,gdb的命令很多,所以把它分成许多个种类。help命令只是例出gdb的命令种类,如果要看某类中的命令,可以使用help 命令,如:help breakpoints,查看设置断点的所有命令。当如也可以直接help 来查看某个命令的具体信息。
gdb 技巧:在记不清整个命令时,可以只打命令的前一个或几个字符,然后敲击两次TAB键来列出所有以这几个字符开头的命令;另为,大多命令都有缩写,如b同 break,c同continue,n同next,p同print等。另为,一个命令在输入能唯一标示命令的前缀后,按一下TAB键就能补齐命令的全称,比如输入ba后按一下TAB键,就自动补齐为backtrace,输入pr后按一下TAB键就补齐为print。
为调试编译代码

为了使 gdb 正常工作, 你必须使你的程序在编译时包含调试信息. 调试信息包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号. gdb 利用这些信息使源代码和机器码相关联.
在编译时用 -g 选项打开调试选项.

在GDB中运行程序
当以gdb
方式启动gdb后,可以使用r或是run命令运行程序。在程序运行之前,你有可能需要设置下面四方面的事。
1、程序运行参数。
set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。

2、运行环境。
path 可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。

3、工作目录。
cd 相当于shell的cd命令。
pwd 显示当前的所在目录。

4、程序的输入输出。
info terminal 显示你程序用到的终端的模式。
使用重定向控制程序输出。如:run > outfile
tty命令可以指写输入输出的终端设备。如:tty /dev/ttyb
调试已运行的程序
可以有两种方法调试已运行程序:
1、用ps查看正在运行的程序的进程ID,然后用gdb
PID格式挂接正在运行的程序。
2、先用gdb
关联上程序,并进行gdb,在gdb中用attach命令来挂接程序正在运行的进程。detach可用来取消挂接的进程。
暂停/恢复程序运行
你可以使用info program 来查看程序的当前的执行状态。

在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是continue命令。

查看变量/表达式的值

可以使用print expr(或p expr)来查看程序变量/表达式的值

显示程序栈

可以使用backtrace(或bt)来显示程序栈

单步跟踪

next [n] 执行下一条(或n条)语句,不进入子程序

step [n] 执行下一条(或n条)语句,进入子程序,可用finish从子程序返回
 
 
四、GDB常用命令
backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)
breakpoint 在程序中设置一个断点
cd 改变当前工作目录
clear 删除刚才停止处的断点
commands 命中断点时,列出将要执行的命令
continue 从断点开始继续执行
delete 删除一个断点或监测点;也可与其他命令一起使用
display 程序停止时显示变量和表达时
down 下移栈帧,使得另一个函数成为当前函数
frame 选择下一条continue命令的帧
info 显示与该程序有关的各种信息
jump 在源程序中的另一点开始运行
kill 异常终止在gdb 控制下运行的程序
list 列出相应于正在执行的程序的原文件内容
next 执行下一个源程序行,从而执行其整体中的一个函数
print 显示变量或表达式的值
pwd 显示当前工作目录
pype 显示一个数据结构(如一个结构或C++类)的内容
quit 退出gdb
reverse-search 在源文件中反向搜索正规表达式
run 执行该程序
search 在源文件中搜索正规表达式
set variable 给变量赋值
signal 将一个信号发送到正在运行的进程
step 执行下一个源程序行,必要时进入下一个函数
undisplay display命令的反命令,不要显示表达式
until 结束当前循环
up 上移栈帧,使另一函数成为当前函数
watch 在程序中设置一个监测点(即数据断点)
whatis 显示变量或函数类型
命令的具体使用方法请用上面介绍的help查询,看不明白的地方就多试试。
 

久违的C

很久没有写C程序了。

刚刚换到大搜索,还是有一些不习惯。但,终究,是要习惯的。

昨天因为班会,提前请假回学校了,所以,仔细算起来,我在新部门的工作,是从今天才正式开始做的。上午刚刚看了一点原先的日志统计程序,发现VIM很不熟悉,于是又看了一会VIM的用户手册。因为程序很多,用了Makefile,结果又转到Makefile的文档看了半天。

URL聚类还没有开始做,anchor_text 分析插了进来。刚想了个主意,就被主管否定了,而且还狠狠的批了我一通:现在写程序,处理的数据动辄几十G,再也不能像以前那样想当然的做了。

同类视频网站列表

1。国外同类的老大 http://www.youtube.com/

2。国内较早视频共享网站 http://toodou.com/

3。偶抓过的网站 http://www.tvix.cn/

5。google也来凑热闹 http://video.google.com/

6。今天又新发现一个 http://www.yijian.com/

7。期待偶们自己的杰作 http://v.iask.com/

8。号称全国最大 http://www.56.com/

9。偶偶娱乐,速度不错 http://www.ouou.com/

10。六间房,还是ALPHA版 http://www.6rooms.com/

11。无限空间,mofile http://www.mofile.com/cn/

12。琥播网,居然敢把疯狂的石头完整的放上去 http://www.hubotv.com/

13。世界都在看 http://www.yoqoo.com/index/

 

在新浪的第一天

sina_logo2.gif

早上九点,准时到达理想国际大厦20层。

这次没有过多的波折,前台小姐给了我一张胸卡,来到17层,等了一会,李慧就出来接我们了。

这里说“我们”,是因为同去的还有一个北邮通信的研究生。后来才知道,他也是湖南的,算是半个老乡了。他和我一样,都在爱问搜索当实习生。

李慧先是给我们每人安排了一台电脑。电脑是DELL的,应该是原主人离职了或者是调到其他地方去了,空出来的吧,因为电脑里还有好多的东西。 原主人看来不是很善于安排资料,电脑里乱八七糟的。虽然硬件配置非常好,但跑起来却很慢。实在受不了了,中午吃完饭回来后,就重新装系统了。

因为才来,也没有什么具体的事情,就是整理电脑。上午的时候杨忠伟跟我们两个新来的一起开了个短会,说了一下纪律,无非就是上下班时间,不许打游戏,在服务器上操作的时候注意安全等等。交换了MSN,会后杨大哥给发了好多资料过来,有内部经验Wiki地址,以往培训资料等等。于是就沉下心慢慢看。

中午的时候杨大哥请客,在地下一层。感觉还挺实惠的,特别奇怪的是饭五毛钱一碗,呵呵。

下午的时候杨大哥把我编进了视频搜索项目组,给我发来了项目的SPEC,还跟项目组的人一起开了个会。原来已经有了一个视频搜索,但不知道为什么要推倒重来。几个技术难点都不归我们负责,比如说视频格式转换,视频内容抓取等。我们只管做一个大致的PHP前台出来。关键在于搜索功能要好。

到六点刚过,李惠过来问我是否加班。当然是不加,收拾了一下,便结束了第一天的上班。

新浪面试归来

logo_iask.gif

2006年5月31日,农历五月初五,端午节。

首发:http://tangfl.cbw.org.cn 

转载请注明出处

     早晨起来的时候,不小心从床上掉下来了。摔的那个疼啊,头还撞在凳子上了。晕,不好的兆头。
     下午3点有一个讲座,一个空军中将来师大,也不知道讲些什么。因为是信息学院组织的,院里通知要求大家都去,要签到。但是,我还是逃了。
     到理想国际大厦的时候,已经是3点50了。先上到20层,到新浪的前台签到,前台的jj给了一个来宾胸卡,让贴在衣服上。然后,来到17层。笔试和面试将在这里举行。
     开始不知道要打分机让hr的人出来接,还以为等到点了就会有人来,于是我在门外无聊的等了好一会。有一点紧张,有一点期待,因为是第一个面试(如果去年在光芒国际的面试不算的话)。并没有做多少准备,甚至连自我介绍都没有事先背一段。而且,后面面试的jj也的确问到了这个问题,后面再说。
     等了一会,到4点了,还没有人出来接。一个gg问我来做什么的,我说来面试的,他又问打电话了没,我才知道要主动打进去。打了电话后一会,昨天通知我的李小姐出来了。叫她李小姐因为我不知道是jj还是阿姨——她看起来有点像阿姨了,但那样叫好像很不礼貌的说。
     进去后最大的感受就是随处可见的LOGO。一个大大的眼睛,长长的睫毛,到处都是。
     大约拐了4个90度的弯,拐的我都分不清东南西北了,终于在一个从走廊上用玻璃墙分离出来的小隔间里停了下来。李小姐拿出三套题让我选:C,PHP,JAVA。为保险起见,我选了C。一共7页,90分钟。
     刚开始做题,赵老师打电话过来,说cbw上不去了。无语。
     前面4道题是IQ测试类的。
     第一题:一副没有大小王的扑克牌共4种花色,52张。其中有一种花色为将牌。有人手里有13张,每种花色都有,而且张数都不一样。红桃与方块共5张,红桃与梅花共6张。有两张是将牌。问将牌是什么花色。
     第二题:一堆球,共100个。两个人轮流拿,拿到最后一个赢。最少拿1个,最多拿5个。如果你先拿,第一次拿多少保证能赢?
     第三题:用一根金条付工钱。每天的工钱是1/7根金条。只运行弄断金条两次,要求无论工人工作多少天(1-7中的一天)都能支付。(注:根据回忆写的大概意思,原题目记不得了)
     第四题是我没有做出来的一道题目:一架飞机油箱装满油后能飞半个地球。飞机之间能互相加油。有一架飞机要绕地球飞一圈,中途只能通过飞机之间互相加油来补充燃油。问最少要起飞多少架次的飞机。
     后面开始就是程序题了,大多是读程序写结果,也有一道题是描述程序做了什么,顺便说一句,那道题我没有看懂。
     因为是爱问搜索频道 ( http://iask.com ) 的实习生,主要考的还是比较基础的程序。而有一些题目太基础了,我们甚至都没有接触到。
     记忆比较深刻的是考了一个setjmp的函数,还有一个#define DDD(x) x###_abc 的字符串连接的宏,还有一个很诡异的 swich case 中嵌套 while 循环的东西,以及自己写 itoa 函数的实现,fork() 返回值,按字节打印 PIII 机器的 Long 型变量,和一个 %.*s 的打印,等等。
     大约花了50分钟,我把能做的题目都做了。空了两道题,一个是那个飞机加油题,一个是读程序描述功能题。找到李小姐交卷了后,她让我在一个小会议室里等着,接着就去找主管面试了。我觉得新浪还是挺高效率的,不像那些大公司,笔试完以后还要等好几天才有面试通知。
     首先面试的是一个jj,很pp的说。她大约是hr部门的吧,因为她进来的时候手里拿着的是我的简历。然后她就开始提问题了,用的是中文。大致的问题有:关于ACM竞赛的,关于CBW网站的,自己的优点,自己的缺点等等。优点和缺点我昨晚都稍微准备了一下,还不至于慌乱。当然,在表述缺点的时候心里还是挺紧张的,因为我说的缺点是不太会与人共事。我知道现在的企业都挺看重 co-work 的。我尽量把它表述的不那么坏,完了后看了看面试的jj,看不出什么表情。就在我心里忐忑不安的时候,她来了一句:简单介绍一下你自己。晕,怎么中途问这个问题,害的我一点准备都没有,停顿了足足5秒才开始回答,而且说的还是前面她问问题的时候说过的话。唉。
     这次面试两个不足,一个就是准备的不够。在优点,缺点,自我介绍,职业规划,兴趣等面试必问的问题上没有做过多的准备,都是临时发挥的。第二个就是对自己的志愿活动抱了过大的希望。还是枫说的对,企业都不会在意那些东西。
     面试的最后是问问题。我问的是昨晚就想好的问题:培训机会,以及实习时的角色。而她都给了我很好的答复。
     接下来面试的是一个明显技术出身的gg。他进来的时候手里拿的是我刚才的考试试卷。他问我在 itoa 函数中返回0表示什么意思,我就说表示函数执行成功。他说如果让我另外返回一个数,问我还有什么选择。我居然答复说那就返回原来那个参数n吧。晕死了,真是失误。最后他告诉我,他希望返回的是 string buffer 的长度。
     第二个很烂的问题是关于多线程的。他问我是什么原因促使多线程编程越来越重要。我列举了网络,异步,他都摇头。最后我们说到多核,但我还是不知道他期待的答案是什么。
     面试的最后还是问问题,因为前面两个问题都问了,这时只好临时找一个:我问多久能给答复。唉,应该问他对我这次面试有什么建议的。
     出来的时候,太阳正悬在西边的地平线上,晚霞红了半边天。