Saturday Sep 12, 2009

FW: Please join (快来加入)sunpinyin-developers@googlegroups.com

FW from : 素月如何上青天

我们刚刚为SunPinyin项目建立了一个google-group。虽然oso-inputmethod项目也有一个mail-list,不过是和其他opensolaris i18n/l10n项目share的。而且似乎国内的开发者或用户,还是更习惯和倾向使用google-group作为交流的途径。因此我们就创建了这个group。

SunPinyin的开发者会使用这个mail group来讨论开发相关的问题,同时用户也可以用这个mail group来报告发现的问题。大家也可以直接发邮件到sunpinyin-developers-AT-googlegroups-DOT-com

欢迎SunPinyin的新老用户加入sunpinyin-developers-AT-googlegroups-DOT-com; 积极反馈各位在使用中遇到的问题,这将会使我们更快了解SunPinyin的bug和您的需求,并且以最快的随度修改bug和满足您的需求!

您的反馈和需求就是对我们最大的支持! 也是我们前进的最大动力!

期待您的加入!谢谢!

Thursday Jul 16, 2009

如何使用Opensoalris中的多媒体播放器totem

(转载请注明来源地址http://blogs.sun.com/weixue)

安装了Opensolaris后,多数的用户可能马上就像要进行的应用,就是听歌,看电影了。呵呵,可惜阿由于某些原因,很多多媒体格式的解码器都不是默认安装的,可能你发现了,totem这个多媒体播放器其实什么也不能播放。。怎么办呢?很简单安转相应的解码器就行了。玩过Unix/linux的都知道其实这些解码器插件都在GStreamer里。这里为大家提供几个简单的方法可以用现成的:

1. 最有效,最简单,最全面的结局方案就是去这个网站,这里提供了很多Solaris上的多媒体软件,有的是商业的,有的可以自由使用。 把它(http://ips.homeunix.com:10906/) 加到pulisher里,直接就可以安转各种解码器的IPS 包了。比如你要安装播放flash和MPEG的解码器插件:

  1. "pkg set-authority -O http://ips.homeunix.com:10906 ips.homeunix.com" to add repository.
  2. "pkg refresh --full" to update catalog.
  3. "pkg install MBLgst-plugin-ffmpeg MBLgst-plugin-flv" to install plugins.

这里还很很多mp3, DVD的插件,转好这些包一般的视频音频基本上可以自由看听了。

2. 这个网站提供了一些:GStreamer Input Selector Plugin for OpenSolaris

http://addons.songbirdnest.com/addon/1354/versions

3. 有个热心人,自己编译了一些常用的解码器: http://blog.sartek.net/2009/05/gstreamer-stuff-on-opensolaris.html

当然,你完全也可以自己下载GStreamer,然后自己编译。

Thursday Mar 19, 2009

关于字体的Bigadmin提交文章上线

最新提交给Bigadmin的关于字体知识的文章上线了。
谈谈字体那些事(第一部分):介绍根据外形字体分类
谈谈字体那些事(第二部分):介绍根据字体数据存贮格式分类
谈谈字体那些事(第三部分):介绍字体的大小的知识


计划继续将这个系列写下去。包扩介绍字体的使用,和字体是如何显示和工作的。

Thursday Feb 26, 2009

Dragon Heads-raising Day

Today is Dragon Heads-rasing Day (二月二龙抬头). Folowing is information about it which forward from BaiduZhidao.

Dragon Heads-raising Day falls on the second day of the second lunar month, which is a traditional festival. In "Imperial Capital Accounts About Seasons", Pan Rongbi in Qing Dynasty wrote the following: The second day is the Dragon Heads-raising Day. On the day, farmers and villagers made an ash path into the houses and kitchens, then wind around the water vats from the outside. This is called leading the dragons back to houses. People in the capital city fry broomcorn millet flour, cakes made of wheat flour and dates, husked wheat rice, and other things as their food. They call this "fumigating insects".

Dragons are auspicious omen, for which Chinese people have an admiration that bordered on worship. Dragons dominate wind and rain. So in ancient days, every time when there was a drought, people would make a straw dragon with sorghum stalks about one zhang (3.33 meters). Then in front of the straw dragon, four men carried the Dragon King’s memorial tablet on a tablet tray and in front of it, people perform acrobatics, singing and dancing, as walking on stilts, doing yangge dance, gongs, drums and flags leading the way. Everywhere contingent of parade passed, every family offered sacrifices, burned incenses and candles to worship the Dragon King. When the straw dragon passed by, people would carry buckets and sprinkle water over the straw dragon and the dragon dancers. They believe that the Dragon King would feel grateful and then make plentiful rain for the mankind.

FW:C中的宏处理

好久没发C的文章了,偶然的机会看到一篇有意思的文章,主要讲解了函数式的宏,转载了过来。原文:转自这里。这位博主还有不少对C语言有趣深入的研究文章。

p>宏的预处理这个坑看起来浅,其实还蛮深的。它也是最容易被忽视的几个地方之一。这里斗胆来谈谈,说实话,在写这句话时我也不清楚这坑究竟有多深,没关系,我们摸着石头过河,一起看看到最后这坑能有多深!同时这篇文章也将会是《C语言编程艺术》中的一部分。

从一个相对简单的例子说起吧。

#define f(a,b) a##b
      #define g(a)   #a
      #define h(a) g(a)
      h(f(1,2))
      g(f(1,2))

相信不少人都见过这个例子。我们不妨再仔细分析一下它的解析过程。应该是这样的:

对于g(f(1,2)),预处理器看到的先是g,然后是(,说明这是一个函数式的宏,好,然后替换后面的实参f(1, 2),得到#f(1,2)(注:直接这么写非法,这里只是为了表示方便而已),因为它前面有个#,所以下一步是不会替换f的参数的!所以进一步得到"f(1, 2)",解析结束。而对于h(f(1,2)),预处理器看到的先是h,然后(,对其参数f(1, 2)进行替换,得到g(f(1,2)),注意这里的下一步是,预处理器就继续往后走,处理刚得到的f(1,2),而不是回过头去再处理g!得到12,到了这里我们的得到的是一个:g(12),然后重新扫描整个宏,替换g,最后得到"12"。

标准第6.10.3.1节中对此描述的还比较清晰,它这样写道:

After the arguments for the invocation of a function-like macro have been
identified, argument substitution takes place. A parameter in the replacement
list, unless preceded by a # or ## preprocessing token or followed by a ##
preprocessing token (see below), is replaced by the corresponding argument
after all macros contained therein have been expanded.

注意加粗的部分。到了在这里,我们可以简单总结一下函数式宏的基本替换流程:

首先要识别出这是一个函数式宏,通过什么?通过调用中出现的(,没错是左括号!到这里后下一步是参数替换,就是根据该宏的定义把实参全部替换进去,然后接着向后走,除非是遇到了#和##(正如上面例子中的g),把后面替换后的东西中如果还有已知宏的话,进行替换或者同样的展开,直到解析到末尾:所有的参数都已经替换完(或者#或##已经处理完);最后,预处理器还会对整个宏再进行一次扫描,因为前一轮替换中有可能在前面替换出一些新的东西来(比如上面例子中的h)。

这里咋看之下没什么问题,其实问题很多!为什么?因为宏替换不仅允许发生在“调用”宏的时候,而且还发生在它定义时!

问题1:宏的名字本身会被替换吗?

这个问题也可以这样问:宏允许被重新定义吗?不允许,但是允许相同的重新定义。标准这样写道:

An identifier currently defined as an object-like macro shall not be
redefined by another #define preprocessing directive unless the second definition
is an object-like macro definition and the two replacement lists are identical.
Likewise, an identifier currently defined as a function-like macro shall not be
redefined by another #define preprocessing directive unless the second definition
is a function-like macro definition that has the same number and spelling of
parameters, and the two replacement lists are identical.

问题2:宏的参数(形参)会被替换吗?

先举个例子说明这个问题:

#define foo 1
#define bar(foo) foo + 2
bar(a)

我们是得到a+2还是1+2?a+2!因为形参是不会被替换掉的,你想想啊,如果形参都被替换掉了这个宏就没什么作用了!那实参呢?实参会的,因为实参的替换发生在传递这个参数之前:

Before being substituted, each argument’s preprocessing tokens are
completely macro replaced as if they formed the rest of the preprocessing file

问题3:宏中参数之外的符号会被替换吗?

会,上面提到过“after all macros contained therein have been expanded”,也就是说这个发生在参数替换之前。但是,这里有个非常诡异的问题:如果被替换出来的符号正好和形参一样怎么办?就像下面这个例子:

#define foo bar
#define baz(bar) bar + foo
baz(1)

我们会得到1+1还是1+bar?后者,因为替换出来的那个bar是不会计算在形参之内的,虽然标准并没有明确这一点。想想吧,如果是的话那个宏的定义也会被破坏了!

另一个例子:

#define foo bar
#define mac(x) x(foo)
mac(foo)

根据上面所说,我们首先得到foo(foo),然后foo再被替换成bar,最后得到bar(bar)。

好了,到这里我们终于可以看一下更复杂的例子了:

#define m !(m)+n
#define n(n) n(m)
m(m)

这个例子相当复杂,是我见过的最复杂的一个宏。:-) 刚看到我们可能都有点蒙,没关系,咱们一步一步地来。

第一步很好走,第一个m直接被替换,得到:!(m)+n(m),别犹豫,接着往下走,替换最后一个m,得到:!(m)+n(!(m)+n),这时这一遍扫描已经完成。到这里我们得提出另外一个东西才能继续,你可能知道,递归。标准对此的描述是:

If the name of the macro being replaced is found during this scan of the
replacement list (not including the rest of the source file’s preprocessing
tokens), it is not replaced.

在上次替换中,被替换的是m,所以m在这里的再次出现将不会被替换,所以下一步是会替换第一个n,得到:!(m)+!(m)+n(m),注意这里又替换出一个新的m来,这个m会被替换,因为这次扫描���没完成!下一步得到:!(m)+!(m)+n(!(m)+n),第二遍扫描结束,全部的替换完成。

综上,我们可以总结出两条重要的宏替换规则:1)再复杂的宏也只是被扫描两遍,而且递归是不允许发生的,即使在第2遍时;2)一个替换完成后如果还没扫描完,要从被替换的那里继续。

(全文完)

Wednesday Feb 11, 2009

font-conf 的资源连接

本篇主要是为了列出几个关于fonts有用的连接:

首先关于font-conf,英文的原版:http://www.fontconfig.org/fontconfig-user.html
有人对照着翻译了:http://cle.linux.org.tw/~edt1023/fontconfig/fontconfig-user.html
这里还有个简体中文版翻译的片段: http://hi.baidu.com/bullfire/blog/item/4efa27460a904a096b63e5a6.html
个人感觉翻译出来内容看着不如原文清楚,当然如果之前你们有任何基础直接看翻译的文章,可能更看不懂。建议原文译文一起看,来回的反复看效果会更好。
这里有几个例子,都是通过更改字体的配置解决一些实际问题的。http://lfeng.cn/2008/12/05/configure-intrepid-fonts-and-display/
Xorg:http://www.archlinux.it/wiki/index.php?title=Xorg_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
Xorg的字体配置:http://wiki.archlinux.org/index.php/Xorg%E5%AD%97%E4%BD%93%E9%85%8D%E7%BD%AE_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) 

其他一些好的文章:
字体设置:http://www.linuxsir.org/bbs/showthread.php?t=254314
介绍了好多基本的字体概念,入门者值得一看。
http://blog.chinaunix.net/u2/87783/showart.php?id=1769325
简单介绍了X系统的字体只是,以及工作的原理。如果你想了解Xwindow的字体系统,文章开头给出的三个参考连接非常值得一看。
DPI 详解: http://blog.chinaunix.net/u/28570/showart_352426.html
非常详细的讲解DPI这个概念的文章。强烈推荐。


Thursday Feb 05, 2009

由fontconfig 到CSS

在学习fontconfig的配置的时候看到介绍,fontconfig的配置格式解析算法使用的是css2 (Cascading Style Sheets)。自然就计入CSS的主页看了,发现这个专业自动提供很多语言的翻译,其中自然还有中文的CSS主页。这下对于不喜欢读英文的朋友可以说是个福音了。
重叠样式表 (CSS) 是一种为 Web 文档添加样式(例如字体、颜色和边距)简单机制。
举个例子,假如在一个页面或整个网站中,要求凡是标题都为  H1  、黑体字及蓝色,正文则为  4  号字、宋体及黄色,这是一种风格,也即  "  样式  "  ,通过样式表来实现这种风格。  具体的内容大家自己看吧。


The current Fontconfig matching algorithm was inherited from Xft; it was designed to provide a
mechanism similar to cascading style sheets but without actually studying and duplicating that
specification. As the differences are minor, and essentially unwarranted, the matching algorithm in
Fontconfig will be changed to make performing CSS2-style matching more convenient.
There are aspects of CSS2 which Fontconfig cannot perform, in particular, it has no context in which to
interpret terms like “bolder”, “larger” or “wider”. These must still be interpreted by the application.
However, the weight fill-in and slant substitution specifications can easily be replicated, and the relative
weight operators can be handled with some application assistance.
The resulting matching mechanism will be useful wherever CSS2 is used, and also provide a more
accessible specification as developers and users become comfortable using the CSS2 font specification
mechanisms.

Sunday Jan 18, 2009

如何让xterm 显示中文

默认安装好Xorg的xterm后,如果使用默认的配置很多中文的显示都是小方框,也就是无法显示。有2个方法可以暂时解决这个问题,不过都不是特别完美,只不过通过修改配置,或者改变了字号。估计是默认的点阵字体不全的原因,只有默写字号有比较全的字体(GB2312)。

方法1:
修改:/etc/X11/app-defaults/XTerm 中:
\*VT100.utf8Fonts.font:  -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1 
->  \*VT100.utf8Fonts.font5:  -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1
\*VT100.utf8Fonts.font5: -misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1
->  \*VT100.utf8Fonts.font: -misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1
或者直接指定字体启动xterm:
xterm -fn -misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1

方法2:
1、编辑 ~/.Xresources 文件,加入
        xterm\*faceName:AR PL Uming CN
        xterm\*faceSize:12
2、执行  xrdb -load .Xresources
3、重启 xterm,问题解决了。

方法3:
1、编辑 ~/.Xresources 文件 :
    XTerm\*font: -misc-fixed-medium-r-normal-\*-18-120-100-100-c-90-iso10646-1
    XTerm\*wideFont: -misc-fixed-medium-r-normal-\*-18-120-100-100-c-180-iso10646-1
2、执行  xrdb -load .Xresources
3、重启 xterm,问题解决了。

 

Saturday Oct 11, 2008

C99 new feature: 指定初始化 ( designated initializer )

参考 http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
标准C89需要初始化语句的元素以固定的顺序出现,和被初始化的数组或结构体中的元素顺序一样。在ISO C99中,你可以按任何顺序给出这些元素,指明它们对应的数组的下标或结构体的成员名,并且GNU C也把这作为C89模式下的一个扩展。这个扩展没有在GNU C++中实现。其实是gcc有了这个扩展,然后被ISO承认,并且写入C99的标准,但是语法做了一点改动。所以,如果使用这个特性写程序,还是按照C99的语法写才好,这样Sunstudio和gcc都可以编译通过。

GNU gcc对标准的扩展:

标准 C 要求数组或结构变量的初使化值必须以固定的顺序出现,在 GNU C 中,通
过指定索引或结构域名,允许初始化值以任意顺序出现。指定数组索引的方法是在
初始化值前写 '[INDEX] =',要指定一个范围使用 '[FIRST ... LAST] =' 的形式,
例如:

arch/i386/kernel/irq.c
static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1]
= ~0UL };

将数组的所有元素初使化为 ~0UL,这可以看做是一种简写形式。

要指定结构元素,在元素值前写 'FIELDNAME:',例如:

++++ fs/ext2/file.c
41: struct file_operations ext2_file_operations = {
42:         llseek:         generic_file_llseek,
43:         read:           generic_file_read,
44:         write:          generic_file_write,
45:         ioctl:          ext2_ioctl,
46:         mmap:           generic_file_mmap,
47:         open:           generic_file_open,
48:         release:        ext2_release_file,
49:         fsync:          ext2_sync_file,
50 };

将结构 ext2_file_operations 的元素 llseek 初始化为 generic_file_llseek,
元素 read 初始化为 genenric_file_read,依次类推。我觉得这是 GNU C 扩展中
最好的特性之一,当结构的定义变化以至元素的偏移改变时,这种初始化方法仍然
保证已知元素的正确性。对于未出现在初始化中的元素,其初值为 0。


C99的扩展

为了指定一个数组下标,在元素值的前面写上“[index] =”。比如:
     int a[6] = { [4] = 29, [2] = 15 };

相当于:
     int a[6] = { 0, 0, 15, 0, 29, 0 };

下标值必须是常量表达式,即使被初始化的数组是自动的。

一个可替代这的语法是在元素值前面写上“.[index]”,没有“=”,但从GCC 2.5开始就不再被使用,但GCC仍然接受。 为了把一系列的元素初始化为相同的值,写为“[first ... last] = value”。这是一个GNU扩展。比如:
     int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

如果其中的值有副作用,这个副作用将只发生一次,而不是范围内的每次初始化一次。
注意,数组的长度是指定的最大值加一。
在结构体的初始化语句中,在元素值的前面用“.fieldname = ”指定要初始化的成员名。例如,给定下面的结构体,
     struct point { int x, y; };

和下面的初始化,
     struct point p = { .y = yvalue, .x = xvalue };

等价于:
     struct point p = { xvalue, yvalue };

另一有相同含义的语法是“.fieldname:”,不过从GCC 2.5开始废除了,就像这里所示:
     struct point p = { y: yvalue, x: xvalue };

“[index]”或“.fieldname”就是指示符。在初始化共同体时,你也可以使用一个指示符(或不再使用的冒号语法),来指定共同体的哪个元素应该使用。比如:
     union foo { int i; double d; }; union foo f = { .d = 4 };

将会使用第二个元素把4转换成一个double类型来在共同体存放。相反,把4转换成union foo类型将会把它作为整数i存入共同体,既然它是一个整数。(参考5.24节向共同体类型转换。)
你可以把这种命名元素的技术和连续元素的普通C初始化结合起来。每个没有指示符的初始化元素应用于数组或结构体中的下一个连续的元素。比如,
     int a[6] = { [1] = v1, v2, [4] = v4 };

等价于

     int a[6] = { 0, v1, v2, 0, v4, 0 };

当下标是字符或者属于enum类型时,标识数组初始化语句的元素特别有用。例如:
int whitespace[256] = { [' '] = 1, ['\\t'] = 1, ['\\h'] = 1, ['\\f'] = 1, ['\\n'] = 1, ['\\r'] = 1 };

你也可以在“=”前面写上一系列的“.fieldname”和“[index]”指示符来指定一个要初始化的嵌套的子对象;这个列表是相对于和最近的花括号对一致的子对象。比如,用上面的struct point声明:

     struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };

如同一个成员被初始化多次,它将从最后一次初始化中取值。如果任何这样的覆盖初始化有副作用,副作用发生与否是非指定的。目前,gcc会舍弃它们并产生一个警告。

See also:


http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/designators.htm

Wednesday Feb 27, 2008

dbx点滴-(2 )- 所有可以设置的 dbx 环境变量

(接上片)所有可以设置的 dbx 环境变量:

dbx 环境变量                    变量功能说明
                            如果设置为 on, dbx 将检查数组边界。
array_bounds_check on|off
                            默认值:on。
                            允许给 dbx 指定由自定义类加载器加载的 Java 类文件
CLASSPATHX
                            路径
                            控制 dbx 是否使用 pathmap 设置来定位 “不匹配”核
core_lo_pathmap on|off
                            心文件的正确库。默认值:off。
                            SPARC 平台:为 SPARC V8、V9 或具有可视化指令集的
disassembler_version
                            V9 设置 dbx 内建反汇编程序的版本。默认值是
autodetect|v8|v9|v9vis
                            autodetect,可根据运行 a.out 的机器类型动态地设
                            置模式。
                            IA 平台:有效选项为 autodetect。
                            控制 fix 期间的编译行打印。默认值:off
fix_verbose on|off
                            当跟随子进程时,继承或不继承断点。默认值:off
follow_fork_inherit on|off
                            确定派生之后应跟随哪个进程;即,当前进程何时执行
follow_fork_mode
                            fork、 vfork 或 fork1。如果设置为 parent,则进
parent|child|both|ask
                            程跟随父进程。如果设置为 child,则跟随子进程。如
                            果设置为 both,则进程跟随子进程,但父进程保持活动
                            状态。如果设置为 ask,当检测到派生时,将询问应跟
                            随哪个进程。默认值:parent。
                            在检测到派生后,将 follow_fork_mode 设置为 ask,
follow_fork_mode_inner
                            并选择了 stop 时适用。设置此变量后,无需使用 cont
unset|
                            -follow。
parent|child|both
                            如果设置为 autodetect, dbx 将根据文件的语言自动
input_case_sensitive
                            选择区分大小写:Fortran 文件为 false,否则为 true。
autodetect|
                            如果为 true,变量和函数名区分大小写;否则大小写无
true|false
                            实际意义。
                            默认值:autodetect。
                            指定 dbx 查找 Java 源文件的目录。
JAVASRCPATH
                            存储当前 dbx 模式。它可具有以下设置:java、jni 或
jdbx_mode java| jni| native
                            native。

                              jvm_invocation 环境变量允许自定义 JVMTM 软件的
jvm_invocation
                              启动方式。   (术语“Java 虚拟机”和“JVM”表示 JavaTM
                              平台的虚拟机。     )有关详细信息,请参见第 221 页的“自
                              定义 JVM 软件的启动”    。
                              控制用于分析和计算表达式的语言。
language_mode
autodetect|main|c|            • autodetect 将表达式语言设置为当前文件的语言。
c++|fortran|fortran90           用于调试使用混合语言的程序 (默认)           。
                              • main 将表达式语言设置为程序中主例程的语言。用
                                于调试同类程序。
                              • c、 c++、 c++、 fortran 或 fortran90 将表达式
                                语言设置为选定语言。
                              如果启用, dbx 将限制资源的使用,并可使用 300 个以
mt_scalable on|off
                              上的 LWP 调试进程。下方速度将明显减慢。默认值:
                              off。
                              每次调用后,自动调用 fflush()。默认值:on
output_auto_flush on|off
                              打印整型常量的默认基数。默认值:automatic (指针
output_base
                              是十六进制字符,而其他都是十进制)           。
8|10|16|automatic
                              在打印类成员的值和声明时,用于将类名作为类成员的
output_class_prefix on |
                              前缀。如果设置为 on,便给类成员添加前缀。默认值:
off
                              on。
                              如果设置为 on,打印、显示和检查的默认值是 -d。默
output_dynamic_type on|off
                              认值:off。
                              如果设置为 on,打印、显示和检查的默认值是 -r。默
output_inherited_members
                              认值:off。
on|off
output_list_size num          控制 list 命令打印的默认行数。默认值: 10.
output_log_file_name filename 命令日志文件的名称。
                              默认值:/tmp/dbx.log.uniqueID
                              为 char \*s 设置打印字符的 number。默认值: 512.
output_max_string_length
number
                              将 -p 设置为打印、   显示和检查的默认值。       默认值 off。
                                                                  :
output_pretty_print on|off
                              显示文件的短路径名。默认值:on。
output_short_file_name
on|off
                              对于 C++,如果设置为 on,则启用自动函数重载方案。
overload_function on|off
                              默认值:on。
                              对于 C++,如果设置为 on,则启用自动运算符重载方
overload_operator on|off
                              案。默认值:on。
                              如果设置为 on,当弹出一个帧时,自动为本地调用适当
pop_auto_destruct on|off
                              的析构函数。默认值:on。
                         如果设置为 on,   且已连接其他工具,      将阻止 dbx 连接到
proc_exclusive_attach
                         进程。 Warning: 请注意,如果多个工具连接到某个进程
on|off
                         并试图对其进行控制,则会出现混乱。默认值:on。
                         将错误记录到 rtc_error_log_file_name 并继续。
rtc_auto_continue on|off
                         默认值:off。
                         如果设置为 on,   则只报告一次指定位置的 RTC 错误。       默
rtc_auto_suppress on|off
                         认值:off。
                         在显式或通过 check -all 打开内存使用检查时使用。
rtc_biu_at_exit
                         如果值为 on,在退出程序时会生成一个非冗余内存使用
on|off|verbose
                         (使用的块)报告。如果值为 verbose,则会在程序退
                         出时生成一个冗余内存使用报告。值为 off 时将不产生
                         任何输出。默认值:on。
rtc_error_limit number   要报告的 RTC 错误数目。默认值:1000.
                         记录 RTC 错误的文件名 (如果设置了
rtc_error_log_file_name
filename                                    。默认值:
                         rtc_auto_continue)
                         /tmp/dbx.errlog.uniqueID
                         如果设置为 on,栈跟踪将显示与 RTC 内部机制相对应
rtc_error_stack on|off
                         的帧。默认值:off。
                         如果设置为 on,则启用从调试程序执行的子进程的运行
rtc_inherit on|off
                         时检查,并导致 LD_PRELOAD 环境变量被继承。默认
                         值:off。
                         在内存泄露检查为 on 时使用。如果值为 on,在退出程
rtc_mel_at_exit
                         序 时 将 生 成 一 个 非 冗 余 内 存 泄 露 报 告。如 果 值 为
on|off|verbose
                         verbose,则会在程序退出时生成一个冗余内存泄漏报
                         告。值为 off 时将不产生任何输出。默认值:on。
                         如果在没有活动程序时设置为 on,step、next、stepi
run_autostart on|off
                         和 nexti 将隐式运行程序,并在语言相关的 main 例程
                         处停止。  如果设置为 on,   需要时可通过 cont 开始 run。
                         默认值:off。
                         控制是否将用户程序的输入 / 输出重定向至 dbx 的
run_io stdio|pty
                         stdio 或特定 pty。 pty 由 run_pty 提供。默认值:
                         stdio。
run_pty ptyname          当 run_io 设置为 pty 时,  设置 pty 名称以供使用。  Pty
                         供图形用户界面包装器使用。
                         如果设置为 on,则不会加载任何符号信息。符号信息可
run_quick on|off
                         使用 prog -readsysms 按需加载。直到 dbx 的行为
                         如同所调试的程序被剥离。默认值:off。
                           dbx 与被调试程序之间的多路复用 tty 设置、进程组和
run_savetty on | off
                           键盘设置(如果命令行中使用了 -kbd)          。用于调试编辑
                           器和 shell。  如果 dbx 获取了 SIGTTIN 或 SIGTTOU,并
                           弹回到 shell,则将其设置为 on。将其设置为 off 可稍
                           稍加快速度。如果 dbx 连接到被调试对象,或正在 Sun
                           Studio IDE 中运行,则该设置无关。默认值:on。
                           如果设置为 on,     当程序运行时,setpgrp(2) 将在派生
run_setpgrp on | off
                           后立即执行。默认值:off。
                           如果设置为 on,枚举器将被置于全局范围,而不是文件
scope_global_enums on |off
                           范围。在处理调试信息前设置 (~/.dbxrc)。默认值:
                           off。
                           如果设置为 on,则在当前范围之外查找文件静态符号。
scope_look_aside on | off
                           默认值:on。
                           dbx 记录所有命令及其输出的文件名。输出将被附加至
session_log_file_name
filename                   文件。默认值:"" (无会话记录)        。
                           如果设置为 on,当被调试程序在未使用 -g 编译的函数
stack_find_source on | off
                           中停止时, dbx 将尝试查找并自动激活栈的第一帧。
                           默认值:on。
stack_max_size number      设置 where 命令的大小默认值。默认值: 100.
                           控制 where 中参数和行信息的打印。默认值:on。
stack_verbose on | off
                           如果设置为 stop,则在单步执行时 dbx 在 longjmp()、
step_abflow stop | ignore
                           siglongjmp() 和 throw 语句中停止。如果设置为
                           ignore,则 dbx 不检测 longjmp() 和 siglongjmp()
                           的异常控制流更改。
                           如果设置为 on,在使用 step 和 next 命令单步执行代
step_events on |off
                           码时允许断点。默认值:off。
                           控 制 源 代 码 行 单 步 执 行 的 粒 度。如 果 设 置 为
step_granularity statement
| line                     statement,则以下代码:
                           a() ; b() ;
                           执行两个 next 命令。如果设置为 line,将由单个
                           next 命令执行代码。在处理多行宏时,行的粒度是非常
                           有用的。默认值:statement。
                           设置版本级别,级别以下的启动信息不打印。默认值:
suppress_startup_message
number                     3.01.
                           如果设置为 on,则对于每个 include 文件,只读取一
symbol_info_compression
                           次调试信息。默认值:on。
on|off
trace_speed number         设置跟踪执行的速度。其值是步骤之间暂停的秒数。
                           默认值: 0.50.

 

dbx点滴-(1)

断断续续的看过dbx手册的一些章节,虽然大部分的内容不常用到,但是对某些特定情形的调试还是相当有用。本博的目的就是把一些个人认为有用的东西摘抄出来,方便查询。

1>

要消除库问题并用 dbx 调试 “不匹配”的核心文件,您可以执行以下操作:
1. 将 dbx 环境变量 core_lo_pathmap 设置为 on。
2. 使用 pathmap 命令告知 dbx 核心文件的正确库的位置。
3. 使用 debug 命令加载程序和核心文件。
例如,假定核心主机的根分区已通过 NFS 导出,并且可以通过 dbx 主机上的
/net/core-host/ 访问,应使用下面的命令加载 prog 程序和 prog.core 核心文件
来进行调试:
 (dbx) dbxenv core_lo_pathmap on
 (dbx) pathmap /usr /net/core-host/usr
 (dbx) pathmap /appstuff /net/core-host/appstuff
 (dbx) debug prog prog.core
如果没有导出核心主机的根分区,则必须手动复制这些库。不需要重新创建符号链接。
(例如,  您不必建立从 libc.so 到 libc.so.1 的链接,       只要确保 libc.so.1 可用。) 


注意事项
调试不匹配的核心文件时应注意:
■ pathmap 命令不能识别 “/”路径映射,因此不能使用以下命令:
  pathmap / /net/core-host
■  pathmap 命令的单参数模式不能与加载对象路径名同时使用,因此请使用二元模式
  from-path to-path。
 

■ 如果 dbx 主机使用的 Solaris 操作环境版本与核心主机相同或更新,那么调试核心文件时效果可能会更好,虽然这并不总是必要的。可能需要的系统库是:
   ■ 对于运行时链接程序: 
        /usr/lib/ld.so.1
        /usr/lib/librtld_db.so.1
        /usr/lib/64/ld.so.1
        /usr/lib/64/librtld_db.so.1
   ■ 对于线程库,取决于您所使用的 libthread 执行: 
        /usr/lib/libthread_db.so.1
        /usr/lib/64/libthread_db.so.1
        /usr/lib/lwp/libthread_db.so.1
        /usr/lib/lwp/64/libthread_db.so.1
   /usr/lib/lwp 文件仅适用于在 Solaris 8 操作环境中运行 dbx 的情况,  并且仅在您
   使用交替 libthread 库时适用。
   如果 dbx 在支持 64 位的 Solaris OS 版本上运行,则需要 xxx_db.so 库的 64 位版
   本,因为这些系统库是作为 dbx 的一部分而不是目标程序的一部分装入和使用的。
   ld.so.1 库是核心文件映像的一部分,与 libc.so 或其他任何库一样,因此需要与
   创建该核心文件的程序相匹配的 32 位 ld.so.1 库或 64 位 ld.so.1 库。
■ 如果正在查看来自某个线程程序的核心文件,并且 where 命令未显示栈,请尝试使用
   lwp 命令。例如:
  (dbx) where
  current thread: t@0
  [1] 0x0(), at 0xffffffff
  (dbx) lwps
  o>l@1 signal SIGSEGV in _sigfillset()
  (dbx) lwp l@1
  (dbx) where
  =>[1] _sigfillset(), line 2 in "lo.c"
     [2] _liblwp_init(0xff36291c, 0xff2f9740, ...
     [3] _init(0x0, 0xff3e2658, 0x1, ...
  ...
   缺少线程栈表明 thread_db.so.1 有问题,因此,需要尝试从核心主机中复制适当
   的 libthread_db.so.1 库。
 

2>
启动加载配置文件的顺序:
dbx  -s可以指定加载的初始化配置文件。
寻找.dbxrc 的顺序:
/installation_directory/lib ->
当前目录./.dbxrc-> $HOME: $HOME/.dbxrc
 在 Solaris 平台上,默认 installation_directory 为
/opt/SUNWspro ;在 Linux 平台上,默认 installation_directory 为
/opt/sun/sun/sunstudio10u1

3>
创建 .dbxrc 文件:
(dbx) help .dbxrc>$HOME/.dbxrc

Friday Nov 09, 2007

BigAmin 技术文章:在同一个硬盘上安装多个版本的Solaris OS (适用平台:X86 / SPARC )中文版上线

BigAmin 技术文章:在同一个硬盘上安装多个版本的Solaris OS (适用平台:X86 / SPARC )中文版上线了。

同时日文版也已经在翻译计划中,相信很快就会上线。

http://www.sun.com/bigadmin/hubs/multilingual/simp_chinese/content/install_multi_solaris.jsp

 

英文版参见http://blogs.sun.com/weixue/entry/my_first_bigadmin_tech_article 或者

http://www.sun.com/bigadmin/features/articles/install_multi_solaris.jsp

Tuesday Sep 18, 2007

How To Set Env For Using GNU Gcc In Solaris (English&中文)

How to using gcc to compile in Solaris:

Some GNU software must be build by gcc, and for most of  Solaris developer, default compiler is SunStudio, so,for using gcc in Solaris, you should set some env variable.

export CPP="/usr/sfw/bin/gcc -E"

export CC=/usr/sfw/bin/gcc

export CXX=/usr/sfw/bin/g++


在Solaris中编译gnu的软件,有时候必须使用gcc.对于Solaris上的开发者来说,通常默认使用的是SunStutio,所以直接编译这些GNU软件可能行不通,需要进行一些设置才能使用gcc来编译。

首先介绍一些常用的内置变量:

CC:用来指定c编译器

CPP:c编译器预编译

CXX:用来指定cxx编译器

PKG_CONFIG_PATH:用来指定pkg-config用到的pc文件的路径,默认是/usr/lib/pkgconfig,pc文件是文本文件,扩展名是.pc,里面定义开发包的安装路径,Libs参数和Cflags参数等等。

因为Solaris通常将GNU的编译器已经安装到/usr/sfw/bin/中,(当然你也可以自己安装gcc到你喜欢的目录,设置时制定你所设置的目录即可),所以通常需要做的设置如下:

export CPP="/usr/sfw/bin/gcc -E"

export CC=/usr/sfw/bin/gcc

export CXX=/usr/sfw/bin/g++

About

williamxue

Search

Archives
« April 2014
SunMonTueWedThuFriSat
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
Today