在 Solaris 平台上,使用收集器可以从正在运行的进程中收集数据。如果进程已受 dbx 的控制,则可以暂停该进程并使用前几节中所描述的方法来启用数据收集。Linux 平台不支持在正在运行的进程上启动数据收集。
如果进程不受 dbx 的控制,则可以使用 collect -Ppid 命令从正在运行的进程中收集数据,如使用 collect 实用程序从正在运行的进程中收集数据中所述。您还可以向其附加 dbx,收集性能数据,然后从该进程分离并使进程继续运行。如果要为选定的子孙进程收集性能数据,必须将 dbx 附加到每个进程。
确定程序的进程 ID (process ID, PID)。
如果从命令行启动了程序并将其置于后台,shell 将在标准输出中列显其 PID。否则,可以通过键入以下内容来确定程序的 PID。
% ps -ef | grep program-name |
附加到该进程。
从 dbx 键入以下内容。
(dbx) attach program-name pid |
如果 dbx 尚未运行,请键入以下内容。
% dbx program-name pid |
附加到正在运行的进程会使该进程暂停。
有关附加到进程的更多信息,请参见手册《Oracle Solaris Studio 12.2:使用 dbx 调试程序》。
启动数据收集功能。
在 dbx 中,使用 collector 命令来设置数据收集参数,使用 cont 命令来恢复执行进程。
从进程中分离。
在完成对数据的收集之后,暂停该程序并从 dbx 中分离该进程。
从 dbx 键入以下内容。
(dbx) detach |
如果要收集任何种类的跟踪数据,则必须在运行程序之前预装入收集器库 libcollector.so。要收集堆跟踪数据或同步等待跟踪数据,还必须分别预装入 er_heap.so 和 er_sync.so。这些库提供了能使数据收集发生的实际函数的包装。此外,收集器还将包装函数添加到其他系统库调用中,以保证性能数据的完整性。如果未预装入库,则不能插入这些包装函数。有关收集器如何插入系统库函数的更多信息,请参见使用系统库。
要预装入 libcollector.so,必须使用环境变量同时设置库的名称和库的路径,如下表中所示。使用环境变量 LD_PRELOAD 设置库的名称。使用环境变量 LD_LIBRARY_PATH、LD_LIBRARY_PATH_32 或 LD_LIBRARY_PATH_64 设置库的路径。如果未定义 _32 和 _64 变量,则使用 LD_LIBRARY_PATH。如果已经定义了这些环境变量,则向其中添加新值。
表 3–2 用来预装入 libcollector.so、er_sync.so 和 er_heap.so 的环境变量设置
环境变量 |
值 |
---|---|
LD_PRELOAD |
libcollector.so |
LD_PRELOAD |
er_heap.so |
LD_PRELOAD |
er_sync.so |
LD_LIBRARY_PATH |
/opt/solstudio12.2/prod/lib/dbxruntime |
LD_LIBRARY_PATH_32 |
/opt/solstudio12.2/prod/lib/dbxruntime |
LD_LIBRARY_PATH_64 |
/opt/solstudio12.2/prod/lib/v9/dbxruntime |
LD_LIBRARY_PATH_64 |
/opt/solstudio12.2/prod/lib/amd64/dbxruntime |
如果 Oracle Solaris Studio 软件未安装在 /opt/solstudio12.2 中,请向系统管理员咨询正确的路径。可以在 LD_PRELOAD 中设置全路径,但是,当使用 SPARC V9 64 位体系结构时,这样做会使问题复杂化。
运行后删除 LD_PRELOAD 和 LD_LIBRARY_PATH 设置,以便它们对于从同一个 shell 启动的其他程序无效。