[分享]刚学一招truss

发表于:2007-06-09来源:作者:点击数: 标签:
不知道怎么回事,无法ftp,输入正确用户和密码,总是说loginincorrect.看了 /etc/ .net d.conf,甚至重装了ftp得包,还是不行。 解决 打开一窗口,实时监测inetd truss-fa-topen,fork,exec-p198--198为inetd的PID 打开另一窗口, ftp192.168.0.10 监测窗口出现

不知道怎么回事,无法ftp, 输入正确用户和密码,总是说"login incorrect". 看了
/etc/.netd.conf, 甚至重装了ftp 得包,还是不行。

解决

打开一窗口,实时监测inetd

 truss -fa -t open,fork,exec -p 198  --> 198 为inetd 的PID

打开另一窗口,

ftp  192.168.0.10

监测窗口出现

1276:   open64("/etc/shells", O_RDONLY)                 = 3

去查,果然/etc/shells 有毛病,如是仅有一行

/etc/ftponly

改成 

/bin/ksh
/bin/sh

再FTP, 成功也

WHY 出现这个现象?俺只记得前天上机时喝了一瓶啤酒 :emn2: 

 boyu 回复于:2003-01-04 07:29:16
谢谢laoxia


 josephxd 回复于:2003-01-04 07:54:11
謝謝了.

 iricyan 回复于:2003-01-04 09:57:57
faint!

laoxia喝酒也不告诉偶!你的签名又改了!

呵呵!偶也知道了!/bin/truss!

 linz 回复于:2003-01-04 10:27:30
good
呵呵就这样偷学了不少东西

 llc107 回复于:2003-01-04 10:38:24
下回登录时用用户名“BEER”,口令:“tasty”就好了 :-P

 hbbeger 回复于:2003-01-04 19:21:49
good

 procrus 回复于:2003-01-04 19:25:47
又多了一个工具:)
谢谢laoxia

 bigbear0118 回复于:2003-01-04 20:01:45
高手

 hutao 回复于:2003-01-04 23:49:16
感谢laoxia:)

 race 回复于:2003-01-05 10:04:34
老下,多写点嘛

 laoxia 回复于:2003-01-05 10:16:11
等俺下次喝完啤酒D

 race 回复于:2003-01-05 10:21:02
我送你1箱百威

 mmmmn 回复于:2003-01-05 12:08:13
Cool Commands 
Peter Baer Galvin 

There are so many commands in Solaris that it is difficult to separate the cool ones from the mundane. For example, there are commands to report how much time a program spends in each system call, and commands to dynamically show system activities, and most of these commands are included with Solaris 8 as well as Solaris 9. This month, I’m highlighting some of the commands that you might find particularly useful. 

Systems administrators are tool users. Through experience, we have learned that the more tools we have, the better able we are to diagnose problems and implement solutions. The commands included in this column are gleaned from experience, friends, acquaintances, and from attendance at the SunNetwork 2002 conference in September. “The /procodile Hunter” talk by Solaris kernel developers Brian Cantrill and Mike Shapiro was especially enlightening and frightening because Cantrill wrote code to illustrate a point faster than Shapiro could explain the point they were trying to illustrate! 

Useful Solaris Commands 

truss -c (Solaris >= 8): This astounding option to truss provides a profile summary of the command being trussed: 


$ truss -c grep asdf work.doc
syscall              seconds   calls  errors
_exit                    .00       1
read                     .01      24
open                     .00       8      4
close                    .00       5
brk                      .00      15
stat                     .00       1
fstat                    .00       4
execve                   .00       1
mmap                     .00      10
munmap                   .01       3
memcntl                  .00       2
llseek                   .00       1
open64                   .00       1
                        ----     ---    ---
sys totals:              .02      76      4
usr time:                .00
elapsed:                 .05
It can also show profile data on a running process. In this case, the data shows what the process did between when truss was started and when truss execution was terminated with a control-c. It’s ideal for determining why a process is hung without having to wade through the pages of truss output. 


truss -d and truss -D (Solaris >= 8): These truss options show the time associated with each system call being shown by truss and is excellent for finding performance problems in custom or commercial code. For example:


$ truss -d who
Base time stamp:  1035385727.3460  [ Wed Oct 23 11:08:47 EDT 2002 ]
 0.0000 execve(“/usr/bin/who”, 0xFFBEFD5C, 0xFFBEFD64)  argc = 1
 0.0032 stat(“/usr/bin/who”, 0xFFBEFA98)                = 0
 0.0037 open(“/var/ld/ld.config”, O_RDONLY)             Err#2 ENOENT
 0.0042 open(“/usr/local/lib/libc.so.1”, O_RDONLY)      Err#2 ENOENT
 0.0047 open(“/usr/lib/libc.so.1”, O_RDONLY)            = 3
 0.0051 fstat(3, 0xFFBEF42C)                            = 0
. . .
truss -D is even more useful, showing the time delta between system calls: 


Dilbert> truss -D who
 0.0000 execve(“/usr/bin/who”, 0xFFBEFD5C, 0xFFBEFD64)  argc = 1
 0.0028 stat(“/usr/bin/who”, 0xFFBEFA98)                = 0
 0.0005 open(“/var/ld/ld.config”, O_RDONLY)             Err#2 ENOENT
 0.0006 open(“/usr/local/lib/libc.so.1”, O_RDONLY)      Err#2 ENOENT
 0.0005 open(“/usr/lib/libc.so.1”, O_RDONLY)            = 3
 0.0004 fstat(3, 0xFFBEF42C)                            = 0
In this example, the stat system call took a lot longer than the others. 


truss -T: This is a great debugging help. It will stop a process at the execution of a specified system call. (“-U” does the same, but with user-level function calls.) A core could then be taken for further analysis, or any of the /proc tools could be used to determine many aspects of the status of the process.


truss -l (improved in Solaris 9): Shows the thread number of each call in a multi-threaded processes. Solaris 9 truss -l finally makes it possible to watch the execution of a multi-threaded application. 

Truss is truly a powerful tool. It can be used on core files to analyze what caused the problem, for example. It can also show details on user-level library calls (either system libraries or programmer libraries) via the “-u” option.


pkg-get: This is a nice tool (http://www.bolthole.com/solaris) for automatically getting freeware packages. It is configured via /etc/pkg-get.conf. Once it’s up and running, execute pkg-get -a to get a list of available packages, and pkg-get -i to get and install a given package. 


plimit (Solaris >= 8): This command displays and sets the per-process limits on a running process. This is handy if a long-running process is running up against a limit (for example, number of open files). Rather than using limit and restarting the command, plimit can modify the running process. 


coreadm (Solaris >= 8): In the “old” days (before coreadm), core dumps were placed in the process’s working directory. Core files would also overwrite each other. All this and more has been addressed by coreadm, a tool to manage core file creation. With it, you can specify whether to save cores, where cores should be stored, how many versions should be retained, and more. Settings can be retained between reboots by coreadm modifying /etc/coreadm.conf. 


pgrep (Solaris >= 8): pgrep searches through /proc for processes matching the given criteria, and returns their process-ids. A great option is “-n”, which returns the newest process that matches. 


preap (Solaris >= 9): Reaps zombie processes. Any processes stuck in the “z” state (as shown by ps), can be removed from the system with this command. 


pargs (Solaris >= 9): Shows the arguments and environment variables of a process. 


nohup -p (Solaris >= 9): The nohup command can be used to start a process, so that if the shell that started the process closes (i.e., the process gets a “SIGHUP” signal), the process will keep running. This is useful for backgrounding a task that should continue running no matter what happens around it. But what happens if you start a process and later want to HUP-proof it? With Solaris 9, nohup -p takes a process-id and causes SIGHUP to be ignored. 


prstat (Solaris >= 8): prstat is top and a lot more. Both commands provide a screen’s worth of process and other information and update it frequently, for a nice window on system performance. prstat has much better aclearcase/" target="_blank" >ccuracy than top. It also has some nice options. “-a” shows process and user information concurrently (sorted by CPU hog, by default). “-c” causes it to act like vmstat (new reports printed below old ones). “-C” shows processes in a processor set. “-j” shows processes in a “project”. “-L” shows per-thread information as well as per-process. “-m” and “-v” show quite a bit of per-process performance detail (including pages, traps, lock wait, and CPU wait). The output data can also be sorted by resident-set (real memory) size, virtual memory size, execute time, and so on. prstat is very useful on systems without top, and should probably be used instead of top because of its accuracy (and some sites care that it is a supported program). 


trapstat (Solaris >= 9): trapstat joins lockstat and kstat as the most inscrutable commands on Solaris. Each shows gory details about the innards of the running operating system. Each is indispensable in solving strange happenings on a Solaris system. Best of all, their output is good to send along with bug reports, but further study can reveal useful information for general use as well. 


vmstat -p (Solaris >= 8): Until this option became available, it was almost impossible (see the “se toolkit”) to determine what kind of memory demand was causing a system to page. vmstat -p is key because it not only shows whether your system is under memory stress (via the “sr” column), it also shows whether that stress is from application code, application data, or I/O. “-p” can really help pinpoint the cause of any mysterious memory issues on Solaris. 


pmap -x (Solaris >= 8, bugs fixed in Solaris >= 9): If the process with memory problems is known, and more details on its memory use are needed, check out pmap -x. The target process-id has its memory map fully explained, as in: 


# pmap -x 1779
1779:   -ksh
 Address  Kbytes     RSS    Anon  Locked Mode   Mapped File
00010000     192     192       -       - r-x--  ksh
00040000       8       8       8       - rwx--  ksh
00042000      32      32       8       - rwx--    [ heap ]
FF180000     680     664       -       - r-x--  libc.so.1
FF23A000      24      24       -       - rwx--  libc.so.1
FF240000       8       8       -       - rwx--  libc.so.1
FF280000     568     472       -       - r-x--  libnsl.so.1
FF31E000      32      32       -       - rwx--  libnsl.so.1
FF326000      32      24       -       - rwx--  libnsl.so.1
FF340000      16      16       -       - r-x--  libc_psr.so.1
FF350000      16      16       -       - r-x--  libmp.so.2
FF364000       8       8       -       - rwx--  libmp.so.2
FF380000      40      40       -       - r-x--  libsocket.so.1
FF39A000       8       8       -       - rwx--  libsocket.so.1
FF3A0000       8       8       -       - r-x--  libdl.so.1
FF3B0000       8       8       8       - rwx--    [ anon ]
FF3C0000     152     152       -       - r-x--  ld.so.1
FF3F6000       8       8       8       - rwx--  ld.so.1
FFBFE000       8       8       8       - rw---    [ stack ]
-------- ------- ------- ------- -------
total Kb    1848    1728      40       -
Here we see each chunk of memory, what it is being used for, how much space it is taking (virtual and real), and mode information. 


df -h (Solaris >= 9): This command is popular on Linux, and just made its way into Solaris. df -h displays summary information about file systems in human-readable form: 


$ df -h
Filesystem             size   used  avail capacity  Mounted on
/dev/dsk/c0t0d0s0      4.8G   1.7G   3.0G    37%    /
/proc                    0K     0K     0K     0%    /proc
mnttab                   0K     0K     0K     0%    /etc/mnttab
fd                       0K     0K     0K     0%    /dev/fd
swap                   848M    40K   848M     1%    /var/run
swap                   849M   1.0M   848M     1%    /tmp
/dev/dsk/c0t0d0s7       13G    78K    13G     1%    /export/home
Conclusion 
Each administrator has a set of tools used daily, and another set of tools to help in a pinch. This column included a wide variety of commands and options that are lesser known, but can be very useful. Do you have favorite tools that have saved you in a bind? If so, please send them to me so I can expand my tool set as well. Alternately, send along any tools that you hate or that you feel are dangerous, which could also turn into a useful column! 



 race 回复于:2003-01-05 23:52:18
建议mmmmn老大把那几个很重要、但是不太熟悉的命令做个详细说明(汉语)。

 wasp 回复于:2003-01-06 00:05:06
高手,又学一手,谢谢!

 laoxia 回复于:2003-01-06 00:37:25
> truss -fa -t open,fork,exec -p 198  --> 198 为inetd 的PID

-f 意思是监视所有衍生而出的child process
-a  Display all arguments passed to an exec  call after a fork (fork 通俗
讲,应当是产生child process 的意思)
-t  显示想跟踪的system call, 包括 open, close, read, write, fork, exec, 


 superjun 回复于:2003-01-06 10:50:05
这个问题我遇见过,确实是shell的问题。

 无人喝彩 回复于:2003-01-06 20:15:29
[这个贴子最后由mmmmn在 2003/01/07 08:43am 编辑]

在solaris中有很多难区分的不平凡的命令。举个例子来说,在solaris8和solaris9中,有些命令可以显示出一个程序的每一个系统进程占用了多长的时间,或者动态的显示系统的活动信息。
Systems administrators(用户组14)是一个有用的用户。根据经验,我们知道我们拥有的工具越多,我们能检测和解决问题就越容易。在这个专栏中是一些从经验,朋友,熟人以及在今年9月的SunNetwork 2002中收集到的一些命令。Solaris核心的开发人员Brian Cantrill和Mike Shapiro所讲的“The /procodile Hunter”让所有人感到有启发,并且感到恐惧,因为Cantrill写代码来表明一个观点的速度要比Shapiro讲解这个观点的速度还要快。

有用的Solaris 命令:
truss -c (Solaris >= 8): 这是个令人惊讶的选项,它提供一个被跟踪命令的一个全面的总结。
$ truss -c grep asdf work.doc
syscall              seconds   calls  errors
_exit                    .00       1
read                     .01      24
open                     .00       8      4
close                    .00       5
brk                      .00      15
stat                     .00       1
fstat                    .00       4
execve                   .00       1
mmap                     .00      10
munmap                   .01       3
memcntl                  .00       2
llseek                   .00       1
open64                   .00       1
                       ----     ---    ---
sys totals:              .02      76      4
usr time:                .00
elapsed:                 .05
它也可以显示一个关于正在运行的进程的全面的数据。在这种情况下,数据显示出在truss命令开始和使用control-c来结束truss进程的过程中进程的情况。它是很理想的工具,能判断出一个进程为什么会挂起。

truss -d和truss -D(Solaris>=8):这两个选项显示出truss显示的每一个system call的相关时间,为客户更好的找出性能问题以及调试商业代码提供了有利的帮助。举个例子:
$ truss -d who
Base time stamp:  1035385727.3460  [ Wed Oct 23 11:08:47 EDT 2002 ]
0.0000 execve(“/usr/bin/who”, 0xFFBEFD5C, 0xFFBEFD64)  argc = 1
0.0032 stat(“/usr/bin/who”, 0xFFBEFA98)                = 0
0.0037 open(“/var/ld/ld.config”, O_RDONLY)             Err#2 ENOENT
0.0042 open(“/usr/local/lib/libc.so.1”, O_RDONLY)      Err#2 ENOENT
0.0047 open(“/usr/lib/libc.so.1”, O_RDONLY)            = 3
0.0051 fstat(3, 0xFFBEF42C)                            = 0
. . .
truss -D 是一个更有用的工具,它可以显示call间的延迟时间(就是显示每个call占用的时间)


Dilbert> truss -D who
0.0000 execve(“/usr/bin/who”, 0xFFBEFD5C, 0xFFBEFD64)  argc = 1
0.0028 stat(“/usr/bin/who”, 0xFFBEFA98)                = 0
0.0005 open(“/var/ld/ld.config”, O_RDONLY)             Err#2 ENOENT
0.0006 open(“/usr/local/lib/libc.so.1”, O_RDONLY)      Err#2 ENOENT
0.0005 open(“/usr/lib/libc.so.1”, O_RDONLY)            = 3
0.0004 fstat(3, 0xFFBEF42C)                            = 0
在这个例子中,stat 这个system call比其它的call占用了更多的时间。

truss -T:这是一个很有利的debugging帮助选项。它将在一个特出的system call的时候停止进程的执行。(“-U”也是这个功能,但是在使用user-level功能的call中)这个时候,一个为以后的分析使用的core文件将会产生,或者是使用一些/proc下的工具来观察进程的各方面状态。

truss -l(在solaris9中改良)显示出每个多线程进程中每个call的线程号。solaris 9中truss -l改良成为可以观看每个多线程应用程序的执行情况。

Turss是一个强有力的工具。它可以被使用在分析core文件来找出产生问题的原因。举个例子,使用“-u”选项的truss甚至可以显示出user-level的库的调用的细节(系统库和程序库都可以)。

pkg-get:这是个很好用用来自动获得免费软件包的工具(http://www.bolthole.com/solaris)。它使用/etc/pkg-get.conf来配置。当它配置
好开始运行后,使用pkg-get -a来得到一个可使用包的列表,运行pkg-get -i来下载和安装选中的包。

plimit(Solaris >=8)这个命令用来显示和设置在运行的进程中每个进程的限制。如果一个长时间运行的进程超过了系统的限制(如打开了过多的文件),可以通过这个命令方便的修改,而不用使用limit命令后重新运行该进程。

coreadm(Solaris >=8)在以前的版本中(没有coreadm),core dump会放在进程的工作目录下。并且新的core文件会自动覆盖旧的文件。所
有这些以及更多的功能可以通过coreadm,一个管理core file生成的工具来解决。通用使用这个命令,可以指定在那里存储core,怎样存储,有多少个版本的core文件可以同时保留,以及更多的功能。所有的设置可以通过修改/etc/coreadm.conf来保持,即使机器重新启动。(应该是通过coreadm来修改配置文件,而不是手动去修改)

pgrep(solaris >=8):pgrep根据给出的标准来在/proc中进行搜索,并且返回搜索出的进程的ID。一个常用的选项是“-n”,它返回一个最新的满足条件的进程号。

preap(Solaris >=9):除掉所有的僵尸进程。它查找在ps命令的输出中标记为“z”的进程,并且自动把该系统除去。

pargs(Solaris >=9):显示一个进程产生时使用的参数以及环境变量

nohup -p(Solaris >=9):nohup这个命令可以用来启动一个进程,并且即使启动进程的shell被关闭(如进程得到一个“SIGHUP”信号),这个进程也仍然能够继续运行。这个有利于让一个后台的任务不管碰到什么样的情况仍然可以持续运行。但如果有这样的情况,你已经运行了一个程序,但你临时决定让这个程序不受到HUP信号的影响该怎么做呢?在Solaris9中,可以使用nohup -p后加进程号来使这个进程忽略SIGHUP的影响,就像一开始这个进程就是用nohup启动的一样。

prstat(Solaris >=8):prstat有top软件和其他的许多功能。它和top命令都可以提供一个屏幕的关于进程的有用信息以及其他的相关信息,并且实时性很强,是一个很棒的显示系统性能的窗口。prstat要比top更加准确。它可以提供一些十分好的选项。“-a”可以同时显示进程和用户的信息(默认在cup hog中保存)。“-C”显示进程在处理器中的设置。“-j”按照“项目”的方式显示进程。“-L”按照显示每个进程的方法显示每个线程。“-m”和“-v”显示一个十分详细的每个进程性能的细节(包括pages,traps,lock wait,和cup wait)。所有显示的数据都可以按照在内存中的设置的大小,虚拟内存大小,运行时间以及其他的方式来排列。prstat是一个十分有效的工具,并且由于它的准确性它差不多可以取代top命令(有些地方考虑到prstat是一个可以被sun支持的程序而使用它)。

trapstat (Solaris >=9):trapstat以及lockstat和kstat是solaris中最难以理解的命令。它们显示出了一个运行中的系统内部最具体的细节问题。每个命令都是解决系统发生陌生问题所必不可少的工具。最好的方法是把它们的输出放在错误报告书中提交上去。但为更好的学习,理解它们的内容是十分有必要的。

vmstat -p(Solaris >=8):直到这个选项可以使用前,判断是什么类型的内存命令导致一个系统崩溃都是十分困难的事情。(具体见“se toolkit”)vmstat -p是一个解决这个问题的钥匙。因为它不但显示你的系统是否处在内存紧缺的情况下,而且它还显示了是哪个应用程序的代码,应用程序的数据或者I/O导致了这样的情况。“-p”可以真正的帮助看到一个神秘的内存问题的详细资料。

pmap -x(Solaris >=8,错误修复Solaris >=9):如果知道一个进程有内存问题,并且想获得更多的关于它的细节问题的时候,可以使用pmap -x。后面跟上要检查的进程的ID 号,可以显示出一个完整的解释。如下:
# pmap -x 1779
1779:   -ksh
Address  Kbytes     RSS    Anon  Locked Mode   Mapped File
00010000     192     192       -       - r-x--  ksh
00040000       8       8       8       - rwx--  ksh
00042000      32      32       8       - rwx--    [ heap ]
FF180000     680     664       -       - r-x--  libc.so.1
FF23A000      24      24       -       - rwx--  libc.so.1
FF240000       8       8       -       - rwx--  libc.so.1
FF280000     568     472       -       - r-x--  libnsl.so.1
FF31E000      32      32       -       - rwx--  libnsl.so.1
FF326000      32      24       -       - rwx--  libnsl.so.1
FF340000      16      16       -       - r-x--  libc_psr.so.1
FF350000      16      16       -       - r-x--  libmp.so.2
FF364000       8       8       -       - rwx--  libmp.so.2
FF380000      40      40       -       - r-x--  libsocket.so.1
FF39A000       8       8       -       - rwx--  libsocket.so.1
FF3A0000       8       8       -       - r-x--  libdl.so.1
FF3B0000       8       8       8       - rwx--    [ anon ]
FF3C0000     152     152       -       - r-x--  ld.so.1
FF3F6000       8       8       8       - rwx--  ld.so.1
FFBFE000       8       8       8       - rw---    [ stack ]
-------- ------- ------- ------- -------
total Kb    1848    1728      40       -
在这里我们可以看到所有大块的内存应用,它被什么所使用,占用了多大的内存空间(虚拟和现实的)以及模式的信息。

df -h(Solaris >=9)这个命令在linux上十分流行,现在转移到了solaris的平台上。df -h用一种更方便阅读的方式显示关于文件系统的信息。

$ df -h
Filesystem             size   used  avail capacity  Mounted on
/dev/dsk/c0t0d0s0      4.8G   1.7G   3.0G    37%    /
/proc                    0K     0K     0K     0%    /proc
mnttab                   0K     0K     0K     0%    /etc/mnttab
fd                       0K     0K     0K     0%    /dev/fd
swap                   848M    40K   848M     1%    /var/run
swap                   849M   1.0M   848M     1%    /tmp
/dev/dsk/c0t0d0s7       13G    78K    13G     1%    /export/home
总结
每个管理员都有一些命令用于日常的管理,另一些命令用来在关键的时候使用。这里介绍了一些很少被用到,但却十分有用的命令。你是否也有这样的一些喜爱的命令呢?如果有,请也发送给我,让我也可以增加我的工具。另外,可以发送一些你厌恶或者有危险的工具,它们也有可能变成有用的呢。




 laoxia 回复于:2003-01-06 23:43:42


 mmmmn 回复于:2003-01-07 08:44:20
排版有点乱,我给重新排了一下:)

 cgbright 回复于:2003-01-07 15:28:29
truss 用来调试程序也很不错

 wxy 回复于:2003-01-07 16:30:51
我们常用truss来跟踪一些木马。呵呵。
在linux下面,strace是类似的命令。

 e4gle 回复于:2003-01-08 13:12:08
早就知道了,不编程你们当然觉得这个命令稀罕,这命令用的太多了,但要想真正跟踪还是调试器比较好,比如gdb,adb
它们的原理很简单都是调用ptrace系统调用来实现对进程的动态跟踪调试的


 YT 回复于:2003-01-08 15:10:54
路过,又学了一招..

 prowater 回复于:2003-01-08 16:01:09
呵呵 有收获。

 zufuqing5303 回复于:2003-01-08 16:28:27
漫漫的欣赏中。。。。。。。。。。。。。。。

 laoxia 回复于:2003-01-09 02:07:21
[quote][b]下面引用由[u]YT[/u]在 [i]2003/01/08 05:09pm[/i] 发表的内容:[/b]
越欣赏越觉得有滋味。。。。  ^_^
[/quote]
俺长的这么牛吗? :emn27: 

 RoadMind 回复于:2003-01-09 08:05:54
是的。
很牛

 phoenixli 回复于:2003-01-10 19:50:00
8错~~

 YT 回复于:2003-01-12 01:41:25
因为偶们D意见是一致D嘛....

 phoenixli 回复于:2003-01-12 01:43:42
服了你~~

 YT 回复于:2003-01-12 01:46:43
没有吧?说得偶好像在灌水似的。。。。

 phoenixli 回复于:2003-01-12 01:49:41
难道84吗?

 YT 回复于:2003-01-12 01:50:54
84

 phoenixli 回复于:2003-01-12 02:00:13
7~~

 YT 回复于:2003-01-12 02:03:15
7 2

 phoenixli 回复于:2003-01-12 02:32:13
好啦~~别惹老大们生气了~~

 YT 回复于:2003-01-12 02:33:15
哦,知道了.嘻嘻

 aixy 回复于:2003-01-12 16:36:15
靠,楼上的几位太离谱了吧!这又不是清茶斋!

 williamw2000 回复于:2003-10-01 03:18:13
It's very nice to stitch these commands together. 
BTW, mmmmn, why do you call yourself "mmmmn"

 axiaonet 回复于:2003-12-05 14:31:38
收藏先

原文转自:http://www.ltesting.net