pthdb_session_committed 子例程

用途

便于检查和修改多线程应用程序的 pthread 库对象数据。

pthread 调试库 (libpthdebug.a)

语法

#include <sys/pthdebug.h>

int pthdb_session_committed (pthdb_session_t  session,
                             char            ** name);
int pthdb_session_concurrency (pthdb_session_t  session,
                               int             * concurrencyp);
int pthdb_session_destroy (pthdb_session_t  session)
int pthdb_session_flags (pthdb_session_t session,
                         unsigned long long * flagsp)
int pthdb_session_init (pthdb_user_t  user,
                        pthdb_exec_mode_t  exec_mode,
                        unsigned long long  flags,
                        pthdb_callbacks_t * callbacks,
                        pthdb_session_t * sessionp)
int pthdb_session_pthreaded (pthdb_user_t   user,
                             unsigned long long  flags
                             pthdb_callbacks_t * callbacks,
                             char              ** name)
int pthdb_session_continue_tid (pthdb_session_t  session,
                                tid_t           * tidp,
                                int              cmd);
int pthdb_session_stop_tid (pthdb_session_t  session,
                            tid_t            tid);
int pthdb_session_commit_tid (pthdb_session_t  session,
                              tid_t           * tidp,
                              int               cmd);
int pthdb_session_setflags (pthdb_session_t     session,
                            unsigned long long  flags)
int pthdb_session_update (pthdb_session_t  session)

描述

为了便于调试多个进程, pthread 调试库支持多个会话,每个进程一个。 提供了用于初始化,破坏和定制这些会话的行为的函数。 此外,还提供了用于查询 pthread 库的全局字段的函数。 库中的所有函数都需要与已初始化的会话相关联的会话句柄,但 pthdb_session_init(用于初始化会话) 和 pthdb_session_pthreaded(可以在初始化会话之前调用) 除外。

pthdb_session_committed 报告在 hold/unhold 落实操作完成后调用的函数的符号名称。 此符号名称可用于设置断点,以在完成暂挂/取消暂挂落实时通知调试器。 报告的实际符号名称可以随时更改。 使用以下代码在组合件中实现返回的函数名:

                ori 0,0, 0         # no-op
                blr                # return to caller

这允许调试器使用陷阱指令覆盖 no-op ,并通过单步跳过该指令将其保留在那里。 仅当设置了 PTHDB_FLAG_HOLD 标志时,才支持此功能。

pthdb_session_concurrency 报告 pthread 库的并行级别。 并行级别为 M: N 比率,其中 N 始终为 1。

pthdb_session_destroy 通知 pthread 调试库调试器或应用程序已完成会话。 这将取消分配与会话关联的任何内存,并允许复用会话句柄。

pthdb_session_setflags 更改会话的标志。 使用这些标志,调试器可以定制会话。 标志由以下值组成或一起组成:

描述
PTHDB_FLAG_GPRS 无论在库内部还是通过对调试器的回调,都应将通用寄存器包括在任何上下文读或写中。
PTHDB_FLAG_SPRS 无论在库内部还是通过对调试器的回调,都应将特殊用途寄存器包括在任何上下文读取或写入中。
PTHDB_FLAG_FPRS 无论在库内部还是通过对调试器的回调,都应将浮点寄存器包括在任何上下文读取或写入中。
PTHDB_FLAG_REGS 所有寄存器都应包含在任何上下文读取或写入中,无论是在库内部还是通过对调试器的回调。 这等同于 PTHDB_FLAG_GPRS|PTHDB_FLAG_GPRS|PTHDB_FLAG_GPRS
PTHDB_FLAG_HOLD 调试器将使用 pthread 调试库挂起/取消挂起设施来阻止 pthread 的执行。 此标志不能与 PTHDB_FLAG_SUSPEND一起使用。 此标志仅应由调试器使用。
PTHDB_FLAG_SUSPEND 应用程序正在使用 pthread 库暂挂或继续设施以防止 pthread 的执行。 此标志不能与 PTHDB_FLAG_HOLD一起使用。 此标志用于内省方式,仅应由应用程序使用。
注: PTHDB_FLAG_HOLDPTHDB_FLAG_SUSPEND 只能传递到 pthdb_session_init 函数。 调试核心文件时,不应将 PTHDB_FLAG_HOLDPTHDB_FLAG_SUSPEND 传递到 pthdb_session_init

pthdb_session_flags 函数获取会话的当前标志。

pthdb_session_init 函数指示 pthread 调试库初始化与唯一给定用户句柄相关联的会话。 pthdb_session_init 分配唯一的会话句柄并将其返回给调试器。 如果应用程序的执行方式为 32 位,那么调试器应将 exec_mode 初始化为 PEM_32BIT。 如果应用程序的执行方式为 64 位,那么调试器应将 mode 初始化为 PEM_64BIT。 在此之前使用 pthdb_session_setflags 函数记录了 flagscallback 参数是回调函数的列表。 (另请参阅 pthdebug.h 头文件。) pthdb_session_init 函数调用 symbol_addrs 函数以获取符号的起始地址,并在 pthread 调试库中初始化这些符号的起始地址。

pthdb_session_pthreaded 报告在 pthread 库初始化后调用的函数的符号名称。 此符号名称可用于设置断点,以在初始化 pthread 调试库会话时通知调试器,并开始使用 pthread 调试库来检查 pthread 库状态。 报告的实际符号名称随时可能更改。 此函数是唯一可以在 pthread 库初始化之前调用的 pthread 调试库函数。 使用以下代码在组合件中实现返回的函数名:

                ori 0,0,0           # no-op
                blr                 # return to caller

这很方便地允许调试器使用陷阱指令覆盖 no-op ,并通过单步跳过它将其留在那里。

pthdb_session_continue_tid 函数允许调试器获取必须继续的线程列表,然后再继续单步执行单个 pthread 或继续一组 pthread。 此函数一次报告一个 tid。 如果列表为空或已到达列表末尾,那么将报告 PTHDB_INVALID_TID 。 调试器需要使用它想要的内核线程继续任何 pthread。 调试器负责放置停止线程和继续停止线程。 cmd 参数可以是 PTHDB_LIST_NEXTPTHDB_LIST_FIRST; 如果传递了 PTHDB_LIST_FIRST ,那么将重置内部计数器,并且将报告列表中的第一个 tid。

注: 仅当设置了 PTHDB_FLAG_HOLD 标志时,才支持此功能。

pthdb_session_stop_tid 函数通知 pthread 调试库,它通知 pthread 库停止调试器的线程的 tid。

注: 仅当设置了 PTHDB_FLAG_HOLD 标志时,才支持此功能。

pthdb_session_commit_tid 报告后续内核线程标识,这些标识必须继续落实暂挂和取消暂挂更改。 此函数一次报告一个 tid。 如果列表为空或已到达列表末尾,那么将报告 PTHDB_INVALID_TIDcmd 参数可以是 PTHDB_LIST_NEXTPTHDB_LIST_FIRST,如果传递了 PTHDB_LIST_FIRST ,那么将重置内部计数器并报告列表中的第一个 tid。

注: 仅当设置了 PTHDB_FLAG_HOLD 标志时,才支持此功能。

pthdb_session_update 告知 pthread 调试库更新其有关 pthread 库状态的内部信息。 应该在进程每次在任何其他 pthread 调试库函数之前停止时调用此函数,以确保它们的结果是可靠的。

调用 pthdb_session_update 函数或列表函数报告 PTHDB_INVALID_* 值时,会将每个列表重置为列表顶部。 例如,当 pthdb_attr 报告 PTHDB_INVALID_ATTR 属性时,列表将重置为开头,以便下一个调用报告列表中的第一个属性 (如果有)。

PTHDB_INVALID_OBJECT 的报告表示空列表或列表末尾,其中 OBJECT 是下列其中一个值: PTHREADATTRMUTEXMUTEXATTRCONDCONDATTRRWLOCKRWLOCKATTRKEYTID (视情况而定)。

参数

表 1. 参数
描述
session 会话句柄。
user 调试器用户句柄。
sessionp 指向会话句柄的指针。
name 符号名称缓冲区。
cmd 重置为列表的开头。
concurrencyp 库并行缓冲区。
flags 会话标志。
flagsp 指向会话标志的指针。
exec_mode Debuggee 执行方式: PEM_32BIT (对于 32 位进程) 或 PEM_64BIT (对于 64 位进程)。
callbacks 回调结构。
tid 内核线程标识。
tidp 内核线程标识缓冲区。

返回值

如果成功,那么这些函数将返回 PTHDB_SUCCESS。 否则,它们将返回错误值。

错误代码

表 2。 错误代码
描述
PTHDB_BAD_SESSION 会话句柄无效。
PTHDB_BAD_VERSION pthread 调试库或 pthread 库版本无效。
PTHDB_BAD_MODE 执行方式无效。
PTHDB_BAD_FLAGS 会话标志无效。
PTHDB_BAD_CALLBACK 回调函数不足。
PTHDB_BAD_CMD 命令无效。
PTHDB_BAD_POINTER 缓冲区指针无效。
PTHDB_BAD_USER 用户句柄无效。
PTHDB_CALLBACK 调试器回调错误。
PTHDB_MEMORY 无足够内存。
PTHDB_NOSYS 未实施函数。
PTHDB_NOT_PTHREADED pthread 库未初始化。
PTHDB_SYMBOL 找不到 pthread 库符号。
PTHDB_INTERNAL 库中出错。