2005 年 1 月
远程调试工具?ddd凑合能用MPlayer win32 几个有用的设置Gmail, MSN……图标产生器开题答辩轻松过关: -)gdb print 时报上下文没有该符号One of GNU humorsC 中一个经典错误·数组与指针的区别gdb 中察看 macro又一个郁闷的问题 · 匿名结构
远程调试工具?
日有所得 2005-01-04 17:02:40
自己用的xp,想远程调试linux上的c程序,有啥好的工具?现在老本介绍了两个BVRDE和magic c++,前者试了一下不好 上手,文档不详细,后者还没试过,另外自己试了insight这 个gdb的gui外壳,但我用x-win32老断,干不成事。考虑装cygwin用xfree86或者干脆自己也用linux得了。
ddd凑合能用
日有所得 2005-01-05 22:16:30
insight不知怎么回事调试openssl老死菜,ddd 凑合能用,可以在命令行直接指定参数:
ddd --args ~/bin/openssl x509 -text -in ipaddr.crt
今 天的收获是对比basicConstraint和ipAddrBlock,发现缺的是对ipAddrBlock这个ASN.1对象相应的处理函 数。看了一下,basicConstraint的处理函数都在crypto/x509v3/v3_bcons.c,应该是要添加一个类似的 v3_ipaddrblk.c了。zhjun上次讲的那个自定义ASN.1对象对应的结构的文档要派上用场了。
MPlayer win32 几个有用的设置
日有所得 2005-01-09 20:49:45
这些是看片时不爽,然后google加上看手册找出的设置。
加到配置文件mplayer\mplayer\config中:
指定字幕字体和字符集
subcp=GBK
font=c:\winnt\fonts\simsun.ttc
字幕文字大小,subfont-autoscale=2 指定度量尺度是相对于影片画面的宽度,第二个指定字幕文字大小占3%,这个大小差不 多是合适的
subfont-autoscale=2
subfont-text-scale=3
即使把系统音量调到最大,影片声音还是不够大,No problem,mplayer可以对付,softvol指定使用软件调节音量,后面的max值指定最大调整范围是实际音量的百分之多少
softvol=yes
softvol-max=400
Gmail,MSN……图标产生器
信笔涂鸦 2005-01-10 14:01:08
E-Mail Icon Generator
For GMail, Hotmail, MSN, Yahoo!, AOL and many more!
http://www.nhacks.com/email/index.php
开题答辩轻松过关:-)
信笔涂鸦 2005-01-11 16:24:08
三个老师对我这背景都不熟悉,问不出什么,居然还问了个IETF是什么,问的工作量相关的我早有准备,轻松过关,哈哈。对比别人做的ppt,我的还是字有 点多,中期的时候再注意一下好了。不过我的profile模板肯定是最好看的,嘿嘿
gdb print 时报上下文没有该符号
日有所得 2005-01-14 10:01:34
(gdb) print foo
No symbol "foo" in current context.
但实际上函数中的确有这个变量。原因是使用了优化,int或指针之类的变量被放到寄存器里了,或是没有用的变量优化后不在目标代码中。去掉优 化就好了。
gdb手册里也提到了另一种办法:编译时指定用不同的格式存调试信息:
To solve such problems, either recompile without optimizations, or use
a different debug info format, if the compiler supports several such
formats. For example, GCC, the GNU C/C++ compiler usually supports the
`-gstabs' option. `-gstabs' produces debug info in a format that is
superior to formats such as COFF. You may be able to use DWARF2
(`-gdwarf-2'), which is also an effective form for debug info. See
section `Options for Debugging Your Program or GNU CC' in Using GNU
CC, for more information.
但是我试了一下 -gstabs,发现gdb进去后报找不到源码,不爽,懒得每次指定源码查找路径了,去掉-O3了事。
One of GNU humors :-)
信笔涂鸦 2005-01-14 13:14:13
There are 10 kinds of people in the world - those who understand
binary and those who don't.
From http://www.gnu.org/fun/jokes/10-kinds-of-people.html
Here is another one: http://www.gnu.org/fun/jokes/helloworld.html
C 中一个经典错误·数组与指针的区别
日有所得 2005-01-19 16:06:19
/* extn.c */
char s[] = "Hello world.";
/* main.c */
extern char *s; /* XXX */
int main()
{
s[0] = 'A';
return 0;
}
$ gcc -c main.c extn.c
$ gcc -o main main.o extn.o
$ ./main
Segmentation fault (core dumped)
这是 C 中容易犯的一个经典错误。正确的应该是在 main.c 中声明 s 为 extern char s[];
把修改前后的 main.c 分别 gcc -S 编译成汇编,一比较就清楚了:
$ diff main.s.old main.s
12,13c12
< movb $65, s
可 见:错误版本中 s 声明为指针后,执行时先要取到 s 这个符号本身的地址,从该地址处取出 s 代表的地址放到 eax 中,然后往这个地址存 'A',但是,s 在 extn.o 中作为数组存放在 .text 段中,这个符号的地址就是 extn.o 中那个数组的地址,该处存放的东西是 "Hello world.",取一个指针出来就是四个字节'H', 'e', 'l', 'l'代表的 long,在 little-endian 平台上它是 0x6c6c6548,再往这个地址存字符 'A',就 core dump 了。而在正确版本中,已经知道它是数组了,就只会往 s 这个符号本身的地址处存放了。这便是数组与指针的区别。
总结:访问指针时,先要找到指针变量本身的地址,从该地址处再取到存放的指针值,然后再对指针指向的对象进行访问,是间接访问。访问数组则是先找数组变量 符号代表的地址,对这个地址指向的对象进行访问,是直接访问。
gdb 中察看 macro
日有所得 2005-01-21 10:53:08
gcc 编译时要加参数"-gdwarf-2 -g3"。用法见 gdb 手册中的描述。
常用的也就两个:
info macro macroinfo ma macro 显示宏定义和相关源文件
macro expand expressionmacro exp expression 显示宏展开的结果
macro expand-once expressionmacro exp1 expression 显示宏只展开一层的结果,这个还没实现:-(
注意:
- 只有 list 到了宏定义的地方才能显示宏的信息。很弱智?应该是因为宏跟上下文相关吧
- 还不能支持处理 # 和 ## 这两个 token。这一点倒真是很faint的,导致调试 openssl 时 macro 的功能无用武之地--太多这种东西了
又一个郁闷的问题 · 匿名结构
日有所得 2005-01-24 11:34:54
用 gdb 调试 OpenSSL 代码发现一个 ASN1_VALUE 类型的变量无法察看它的定义
(gdb) pt ptmpval
type = struct ASN1_VALUE_st {
<incomplete>
} *
察看源码只能找到下面这样一句:
typedef struct ASN1_VALUE_st ASN1_VALUE;
却找不到 ASN1_VALUE_st 的定义,ctags 没用,上一次遇到这样的问题是宏名用 ## 拼起来的,这一次,我也考虑了这种情况,用多种组合 grep,但仍是一无所获。
走投无路之下,想到,会不会本来就不存在这样的结构?察看了源码,用到这个类型的地方都是用这种指针,对它内容的引用都是在别的类型之间转换的。
这样也可以?试验了一下:
[wayman@SEND ~/tmp]$ cat tmp.c
typedef struct unknown_st UNKNOWN;
int main()
{
UNKNOWN * u;
int arr[10];
u = (UNKNOWN *)arr;
return 0;
}
[wayman@SEND ~/tmp]$ gcc -Wall tmp.c
[wayman@SEND ~/tmp]$
编译没错,出乎意料,看来我对 C 的理解还是不够深。但也证明了我找不到ASN1_VALUE_st 的定义是正常的,因为根本就不需要有一个实际的定义,程序中没有需要知道它的具体形式的地方,都是把这种指针转来转去的操作。也就是说这个 ASN1_VALUE_st 是一种没有实际定义的结构,ASN1_VALUE_st * 就相当于void *,OpenSSL中这么写只是为了让指针有意义一点,到时候是要转换为已知的某种结构的指针的。但是,可读性真的变好了吗?!不禁越发崇拜 OpenSSL 的作者了。
0 Comments so far