49 lines
1.5 KiB
C
49 lines
1.5 KiB
C
#include <u.h>
|
|
#include <thread_db.h>
|
|
#include <sys/ptrace.h>
|
|
#include <errno.h>
|
|
#include <sys/procfs.h> /* psaddr_t */
|
|
#include <libc.h>
|
|
#include <mach.h>
|
|
|
|
static char *tderrstr[] =
|
|
{
|
|
[TD_OK] "no error",
|
|
[TD_ERR] "some error",
|
|
[TD_NOTHR] "no matching thread found",
|
|
[TD_NOSV] "no matching synchronization handle found",
|
|
[TD_NOLWP] "no matching light-weight process found",
|
|
[TD_BADPH] "invalid process handle",
|
|
[TD_BADTH] "invalid thread handle",
|
|
[TD_BADSH] "invalid synchronization handle",
|
|
[TD_BADTA] "invalid thread agent",
|
|
[TD_BADKEY] "invalid key",
|
|
[TD_NOMSG] "no event available",
|
|
[TD_NOFPREGS] "no floating-point register content available",
|
|
[TD_NOLIBTHREAD] "application not linked with thread library",
|
|
[TD_NOEVENT] "requested event is not supported",
|
|
[TD_NOEVENT] "requested event is not supported",
|
|
[TD_NOCAPAB] "capability not available",
|
|
[TD_DBERR] "internal debug library error",
|
|
[TD_NOAPLIC] "operation is not applicable",
|
|
[TD_NOTSD] "no thread-specific data available",
|
|
[TD_MALLOC] "out of memory",
|
|
[TD_PARTIALREG] "not entire register set was read or written",
|
|
[TD_NOXREGS] "X register set not available for given threads",
|
|
[TD_TLSDEFER] "thread has not yet allocated TLS for given module",
|
|
[TD_VERSION] "version mismatch twixt libpthread and libthread_db",
|
|
[TD_NOTLS] "there is no TLS segment in the given module",
|
|
};
|
|
|
|
static char*
|
|
terr(int e)
|
|
{
|
|
static char buf[50];
|
|
|
|
if(e < 0 || e >= nelem(tderrstr) || tderrstr[e] == nil){
|
|
snprint(buf, sizeof buf, "thread err %d", e);
|
|
return buf;
|
|
}
|
|
return tderrstr[e];
|
|
}
|
|
|