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_HOLD 和 PTHDB_FLAG_SUSPEND 只能传递到 pthdb_session_init 函数。 调试核心文件时,不应将 PTHDB_FLAG_HOLD 和 PTHDB_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 函数记录了 flags 。 callback 参数是回调函数的列表。 (另请参阅 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_NEXT 或 PTHDB_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_TID 。 cmd 参数可以是 PTHDB_LIST_NEXT 或 PTHDB_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 是下列其中一个值: PTHREAD, ATTR, MUTEX, MUTEXATTR, COND, CONDATTR, RWLOCK, RWLOCKATTR, KEY或 TID (视情况而定)。
参数
| 项 | 描述 |
|---|---|
| session | 会话句柄。 |
| user | 调试器用户句柄。 |
| sessionp | 指向会话句柄的指针。 |
| name | 符号名称缓冲区。 |
| cmd | 重置为列表的开头。 |
| concurrencyp | 库并行缓冲区。 |
| flags | 会话标志。 |
| flagsp | 指向会话标志的指针。 |
| exec_mode | Debuggee 执行方式: PEM_32BIT (对于 32 位进程) 或 PEM_64BIT (对于 64 位进程)。 |
| callbacks | 回调结构。 |
| tid | 内核线程标识。 |
| tidp | 内核线程标识缓冲区。 |
返回值
如果成功,那么这些函数将返回 PTHDB_SUCCESS。 否则,它们将返回错误值。
错误代码
| 项 | 描述 |
|---|---|
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 |
库中出错。 |