打印

Sun Studio动手实验教程

本帖已经被作者加入个人空间

练习10:使用SUN性能库执行编译操作

Sun性能库改进了Fortran95或C应用程序的执行速度。该性能库并没有修改和重编译源代码,只是使用SUN Performance Library代码替换已有代码。

在本练习中,尝试使用性能库改进示例代码的性能。

应用程序特性:

    *

      循环。
    *

      计算密集。
    *

      多线程。

源代码名称:testperf.c

   1.

      编译代码,不使用任何选项。
      $cc testperf.c
   2.

      在编译时生成并行模式二进制文件。
      x86

$cc -xarch=amd64 -xparrellel testperf.c -o a1.out SPARC

$cc -xarch=v8plusa -xparrel testperf.c -o a1.out

3)使用Sun性能库修改执行例程。

x86

$cc -dalign -xarch=amd64 -xparrellel testperf.c -o a2.out -xlic_lib=sunperf SPARC

$cc -dalign -xarch=v8plusa -xparrellel testperf.c -o a2.out -xlic_lib=sunperf

4)在编译时自动并行化执行例程。
x86

$cc -xarch=amd64 -xautopar testperf.c -o a3.out SPARC

$cc -xarch=v8plusa - xautopar testperf.c -o a3.out

5)可选:在运行前将环境变量PARALLEL设置为32。

$cc -dalign -xarch=v8plusa -xparrellel testperf.c -o a2.out -xlic_lib=sunperf $export PARALLEL 32

$ ./a. out

在运行时检查线程数量。
$prstat -L|grep a.out

5)比较a.out和其他代码的性能。
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习11:开始使用功能强大的调试工具:dbx

了解dbx中可用的命令。尝试使用dbx跟踪示例代码。

应用程序特性:

    *

      单线程。
    *

      暂停,无操作。

源代码名称:testdebug.c

1)编译示例代码,用于调试。
$cc -g testdebug.c -o testdebug

2)启动dbx并加载程序。

$dbx

(dbx)debug <program name>

To start dbx and load the program to be debugged $dbx <program name>

3)启动dbx并连接到某个运行中的进程,方法是指定该进程的ID。

$dbx – <process id>



$dbx - `pgrep <program name>`



$dbx <program_name> <process_id>



(dbx)debug <program_name process_id>



(dbx)attach <process_id>

4)退出运行中进程。
(dbx)detach

列出所有可用的调试命令。.

$dbx

(dbx)help——打印输出帮助信息

(dbx)commands——列出所有命令

(dbx)man edit——显示“edit”命令的手册页

(dbx) quit——退出调试
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习12:使用dbx调试内核文件

示例应用程序内核在执行时转储。调试内核文件并找出原因。

应用程序特性:

    *

      非法访问内存。

源代码名称:core.c

1)手动生成内核文件并使用内核文件调试程序。找出应用程序中的潜在问题。如果应用程序内核在运行时自动转储,可以使用dbx找出系统崩溃的原因。

$cc -g core.c -o testcore

$dbx <program_name> <corefile_name>

or

(dbx)dbx -c <corefile_name> <program_name>

(dbx)where

(dbx)vi <source_name> <---找出原因并修改代码
(dbx)fix

(dbx)cont

...

2)跟踪程序,使用以下命令:
(dbx)run——运行可执行二进制文件

(dbx)list——列出代码

(dbx)next——跳到下一步

(dbx)print <variable name>——打印输出值 (dbx)stop at <filename: line n>——设置断点 (dbx)stop at <funcname :line n>

(dbx)cont——继续执行

(dbx)call——调用func()

(dbx)delete <breakpoint number>——删除断点

(dbx)fix——修改源代码,无需重新构建

(dbx)quit
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习13:调试多线程应用程序

学习如何使用运行时检查。运行时检查具有以下特性:

    *

      检测内存访问错误。
    *

      检测内存泄漏。
    *

      收集有关内存使用的数据。
    *

      适用于所有语言。
    *

      操作多线程代码。
    *

      不需要重新编译、重新链接或修改makefile文件。

在本练习中,尝试根据运行时检查结果找出内存泄漏发生的位置。

应用程序:hello. c

命令:

(dbx)check -memuse——开启内存使用和内存泄漏检查

(dbx)check -access——开启内存访问检查(只适用于SPARC)

(dbx)uncheck -all——完全关闭运行时检查
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习14:使用dbx调试C++程序

使用dbx调试C++示例程序。

应用程序特性:

异常处理示例。

源代码名称:foo.cc

使用以下命令调试示例程序:

$CC -g foo.cc -o a.out



|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习15:在机器指令级别执行调试操作

本练习将介绍如何在机器指令级别使用事件管理和进程控制命令,如何显示指定内存地址的内容,以及如何显示源代码(按行显示)内容和相应的机器指令。

可以使用以下任意一个示例应用程序进行调试:
helloworld

lp

loop

mt

1)运行dbx并加载程序。

$dbx <program name>

(dbx)listi 13,14——显示13、14行源代码和相应的汇编指令。



(dbx)list -i

2)其他一些最常使用的命令。

(dbx)nexti——跳转到下一条指令

(dbx)stepi——执行一条机器指令(进入调用)
(dbx)tracei step——跟踪各条指令

(dbx)tracei next——跟踪各条指令,但是忽略调用

(dbx)tracei at <address>——跟踪特定的代码地址

(dbx)stopi at <address>——在特定地址设置断点
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习16:在捕获信号时调试和控制程序行为

在本练习中,尝试使用dbx完成以下任务:

    *

      理解信号事件。
    *

      捕获信号。
    *

      向程序发送信号。
    *

      自动处理信号。

应用程序特性:

    *

      单线程。
    *

      获取信号并处理它。

源代码名称:testsig.c

使用以下命令调试示例程序:
1)启动dbx并加载程序。

$dbx <program_name>

比如说:

$cc -g testsig.c -o testsig

$dbx testsig

2)将信号转发给程序。

(dbx)cont -sig <signal_name or signal_number>

3)捕获传递给当前进程的信号。
(dbx)catch

4)忽略传入信号。(dbx)ignore

5)将QUIT和ABRT信号从捕获列表移到忽略列表。
(dbx)ignore QUIT ABRT

6)自动处理信号。

(dbx)stop sig <signal_name or signal_number> (dbx)catch <signal_name or signal_number>
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习17:使用dbx设置断点和跟踪应用程序

当某个事件发生时,dbx允许您停止进程,然后执行任意命令或打印信息。最简单的事件例子就是断点。

源代码名称:helloworld.c

1)在源代码的某一行设置暂停断点。
$dbx <program_name>

$(dbx)stop at filename: n

2)在函数中设置暂停断点。

(dbx)stop in foo(int) (dbx)stop in x::bar()

3)访问某个地址时停止执行。

模式:

r 读取指定地址内存。

w 写入内存。

x 执行内存。

   1.

      访问后停止进程。
   2.

      访问前停止进程。

比如说

(dbx)stop access r 0x4762



(dbx)stop access wb &i

4)当变量发生改变时停止执行。


5)在断点上设置筛选器。


比如说

(dbx)stop in example::example -if data > 20
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习18:Kernel分析

Sun Studio性能工具可以在Solaris OS运行加载的过程中分析内核。在Solaris 10 OS中运行Sun Studio软件时可以使用内核分析。该工具可以显示函数数据、调用者和被调用者数据、指令级数据和时间表数据(而不是源代码行数据)。

1)er_kernel工具使用的是Dtrace驱动程序,它是Solaris 10 OS中内建的一个全面动态跟踪工具。使用root之外的用户运行er_kernel工具并指定必要的权限,在/etc/user_attr文件中加入以下内容:

2)将您自已添加到系统用户组中,在/etc/group文件的sys一行中添加您的用户名称。

3)收集试验数据(Collect the experiment)。


4)在单独的一个shell中运行任意加载。
比如说

$find / -type file

5)加载完成后,终止er_kernel工具,方法是在er_print工具中按Ctrl-C快捷。6)将ktest. 1 .er,加载到er_print工具中。


例子:
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习19:分析用户负荷

如果您有一条命令,无论它是程序或脚本,Sun Studio性能工具都可以分析它的工具负荷。

1)收集试验数据(collect the experiment)。


2)收集内核分析数据和用户分析数据。


比如说,源代码名称:loop.c $cc loop.c -o loop

$./loop

$er_kernel -p on ./loop

3)分析特定的进程或内核线程。



4)使用er_print工具执行性能分析。



5)在一些情况下,您可以使用以下命令归档或导出通过er_kernel工具收集到的试验数据。有关更多信息,请参阅手册页。归档试验数据:



将试验数据导出为ASCII代码:
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP