本文整理汇总了C++中dt_dprintf函数的典型用法代码示例。如果您正苦于以下问题:C++ dt_dprintf函数的具体用法?C++ dt_dprintf怎么用?C++ dt_dprintf使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了dt_dprintf函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: dt_proc_bpmatch
static void
dt_proc_bpmatch(dtrace_hdl_t *dtp, dt_proc_t *dpr)
{
const lwpstatus_t *psp = &Pstatus(dpr->dpr_proc)->pr_lwp;
dt_bkpt_t *dbp;
assert(DT_MUTEX_HELD(&dpr->dpr_lock));
for (dbp = dt_list_next(&dpr->dpr_bps);
dbp != NULL; dbp = dt_list_next(dbp)) {
if (psp->pr_reg[R_PC] == dbp->dbp_addr)
break;
}
if (dbp == NULL) {
dt_dprintf("pid %d: spurious breakpoint wakeup for %lx\n",
(int)dpr->dpr_pid, (ulong_t)psp->pr_reg[R_PC]);
return;
}
dt_dprintf("pid %d: hit breakpoint at %lx (%lu)\n",
(int)dpr->dpr_pid, (ulong_t)dbp->dbp_addr, ++dbp->dbp_hits);
dbp->dbp_func(dtp, dpr, dbp->dbp_data);
(void) Pxecbkpt(dpr->dpr_proc, dbp->dbp_instr);
}
示例2: dt_pid_usdt_mapping
static int
dt_pid_usdt_mapping(void *data, const prmap_t *pmp, const char *oname)
{
struct ps_prochandle *P = data;
GElf_Sym sym;
prsyminfo_t sip;
dof_helper_t dh;
GElf_Half e_type;
const char *mname;
const char *syms[] = { "___SUNW_dof", "__SUNW_dof" };
int i, fd = -1;
/*
* The symbol ___SUNW_dof is for lazy-loaded DOF sections, and
* __SUNW_dof is for actively-loaded DOF sections. We try to force
* in both types of DOF section since the process may not yet have
* run the code to instantiate these providers.
*/
for (i = 0; i < 2; i++) {
if (Pxlookup_by_name(P, PR_LMID_EVERY, oname, syms[i], &sym,
&sip) != 0) {
continue;
}
if ((mname = strrchr(oname, '/')) == NULL)
mname = oname;
else
mname++;
dt_dprintf("lookup of %s succeeded for %s\n", syms[i], mname);
if (Pread(P, &e_type, sizeof (e_type), pmp->pr_vaddr +
offsetof(Elf64_Ehdr, e_type)) != sizeof (e_type)) {
dt_dprintf("read of ELF header failed");
continue;
}
dh.dofhp_dof = sym.st_value;
dh.dofhp_addr = (e_type == ET_EXEC) ? 0 : pmp->pr_vaddr;
dt_pid_objname(dh.dofhp_mod, sizeof (dh.dofhp_mod),
sip.prs_lmid, mname);
if (fd == -1 &&
(fd = pr_open(P, "/dev/dtrace/helper", O_RDWR, 0)) < 0) {
dt_dprintf("pr_open of helper device failed: %s\n",
strerror(errno));
return (-1); /* errno is set for us */
}
if (pr_ioctl(P, fd, DTRACEHIOC_ADDDOF, &dh, sizeof (dh)) < 0)
dt_dprintf("DOF was rejected for %s\n", dh.dofhp_mod);
}
if (fd != -1)
(void) pr_close(P, fd);
return (0);
}
示例3: dt_pid_has_jump_table
static int
dt_pid_has_jump_table(struct ps_prochandle *P, dtrace_hdl_t *dtp,
uint8_t *text, fasttrap_probe_spec_t *ftp, const GElf_Sym *symp)
{
ulong_t i;
int size;
#if defined(sun)
pid_t pid = Pstatus(P)->pr_pid;
char dmodel = Pstatus(P)->pr_dmodel;
#else
pid_t pid = proc_getpid(P);
#if __i386__
char dmodel = PR_MODEL_ILP32;
#elif __amd64__
char dmodel = PR_MODEL_LP64;
#endif
#endif
/*
* Take a pass through the function looking for a register-dependant
* jmp instruction. This could be a jump table so we have to be
* ultra conservative.
*/
for (i = 0; i < ftp->ftps_size; i += size) {
size = dt_instr_size(&text[i], dtp, pid, symp->st_value + i,
dmodel);
/*
* Assume the worst if we hit an illegal instruction.
*/
if (size <= 0) {
dt_dprintf("error at %#lx (assuming jump table)\n", i);
return (1);
}
#ifdef notyet
/*
* Register-dependant jmp instructions start with a 0xff byte
* and have the modrm.reg field set to 4. They can have an
* optional REX prefix on the 64-bit ISA.
*/
if ((text[i] == 0xff && DT_MODRM_REG(text[i + 1]) == 4) ||
(dmodel == PR_MODEL_LP64 && (text[i] & 0xf0) == 0x40 &&
text[i + 1] == 0xff && DT_MODRM_REG(text[i + 2]) == 4)) {
dt_dprintf("found a suspected jump table at %s:%lx\n",
ftp->ftps_func, i);
return (1);
}
#endif
}
return (0);
}
示例4: dt_pid_create_return_probe
int
dt_pid_create_return_probe(struct ps_prochandle *P, dtrace_hdl_t *dtp,
fasttrap_probe_spec_t *ftp, const GElf_Sym *symp, uint64_t *stret)
{
uint32_t *text;
int i;
int srdepth = 0;
dt_dprintf("%s: unimplemented\n", __func__);
return (DT_PROC_ERR);
if ((text = malloc(symp->st_size + 4)) == NULL) {
dt_dprintf("mr sparkle: malloc() failed\n");
return (DT_PROC_ERR);
}
#ifdef DOODAD
if (Pread(P, text, symp->st_size, symp->st_value) != symp->st_size) {
dt_dprintf("mr sparkle: Pread() failed\n");
free(text);
return (DT_PROC_ERR);
}
#endif
/*
* Leave a dummy instruction in the last slot to simplify edge
* conditions.
*/
text[symp->st_size / 4] = 0;
ftp->ftps_type = DTFTP_RETURN;
ftp->ftps_pc = symp->st_value;
ftp->ftps_size = symp->st_size;
ftp->ftps_noffs = 0;
free(text);
if (ftp->ftps_noffs > 0) {
if (ioctl(dtp->dt_ftfd, FASTTRAPIOC_MAKEPROBE, ftp) != 0) {
dt_dprintf("fasttrap probe creation ioctl failed: %s\n",
strerror(errno));
return (dt_set_errno(dtp, errno));
}
}
return (ftp->ftps_noffs);
}
示例5: dt_proc_notify
static void
dt_proc_notify(dtrace_hdl_t *dtp, dt_proc_hash_t *dph, dt_proc_t *dpr,
const char *msg)
{
dt_proc_notify_t *dprn = dt_alloc(dtp, sizeof (dt_proc_notify_t));
if (dprn == NULL) {
dt_dprintf("failed to allocate notification for %d %s\n",
(int)dpr->dpr_pid, msg);
} else {
dprn->dprn_dpr = dpr;
if (msg == NULL)
dprn->dprn_errmsg[0] = '\0';
else
(void) strlcpy(dprn->dprn_errmsg, msg,
sizeof (dprn->dprn_errmsg));
(void) pthread_mutex_lock(&dph->dph_lock);
dprn->dprn_next = dph->dph_notify;
dph->dph_notify = dprn;
//printf("%s pid=%d\n", __func__, Pstatus(dpr->dpr_proc)->pr_pid);
(void) pthread_cond_broadcast(&dph->dph_cv);
(void) pthread_mutex_unlock(&dph->dph_lock);
}
}
示例6: dt_proc_create
struct ps_prochandle *
dt_proc_create(dtrace_hdl_t *dtp, const char *file, char *const *argv)
{
dt_proc_hash_t *dph = dtp->dt_procs;
dt_proc_t *dpr;
int err;
if ((dpr = dt_zalloc(dtp, sizeof (dt_proc_t))) == NULL)
return (NULL); /* errno is set for us */
(void) pthread_mutex_init(&dpr->dpr_lock, NULL);
(void) pthread_cond_init(&dpr->dpr_cv, NULL);
if ((dpr->dpr_proc = Pcreate(file, argv, &err, NULL, 0, dtp->dt_arch)) == NULL) {
return (dt_proc_error(dtp, dpr,
"failed to execute %s: %s\n", file, Pcreate_error(err)));
}
dpr->dpr_hdl = dtp;
dpr->dpr_pid = Pstatus(dpr->dpr_proc)->pr_pid;
(void) Punsetflags(dpr->dpr_proc, PR_RLC);
(void) Psetflags(dpr->dpr_proc, PR_KLC);
if (dt_proc_create_thread(dtp, dpr, dtp->dt_prcmode) != 0)
return (NULL); /* dt_proc_error() has been called for us */
dpr->dpr_hash = dph->dph_hash[dpr->dpr_pid & (dph->dph_hashlen - 1)];
dph->dph_hash[dpr->dpr_pid & (dph->dph_hashlen - 1)] = dpr;
dt_list_prepend(&dph->dph_lrulist, dpr);
dt_dprintf("created pid %d\n", (int)dpr->dpr_pid);
dpr->dpr_refs++;
return (dpr->dpr_proc);
}
示例7: dt_buf_destroy
void
dt_buf_destroy(dtrace_hdl_t *dtp, dt_buf_t *bp)
{
dt_dprintf("dt_buf_destroy(%s): size=%lu resizes=%u\n",
bp->dbu_name, (ulong_t)bp->dbu_len, bp->dbu_resizes);
dt_free(dtp, bp->dbu_buf);
}
示例8: dt_pid_create_glob_offset_probes
/*ARGSUSED*/
int
dt_pid_create_glob_offset_probes(struct ps_prochandle *P, dtrace_hdl_t *dtp,
fasttrap_probe_spec_t *ftp, const GElf_Sym *symp, const char *pattern)
{
dt_dprintf("%s: unimplemented\n", __func__);
return (DT_PROC_ERR);
}
示例9: dt_pid_create_return_probe
int
dt_pid_create_return_probe(struct ps_prochandle *P, dtrace_hdl_t *dtp,
fasttrap_probe_spec_t *ftp, const GElf_Sym *symp, uint64_t *stret)
{
dt_dprintf("%s: unimplemented\n", __func__);
return (DT_PROC_ERR);
}
示例10: dt_module_create
dt_module_t *
dt_module_create(dtrace_hdl_t *dtp, const char *name)
{
long pid;
char *eptr;
dt_ident_t *idp;
uint_t h = dt_strtab_hash(name, NULL) % dtp->dt_modbuckets;
dt_module_t *dmp;
for (dmp = dtp->dt_mods[h]; dmp != NULL; dmp = dmp->dm_next) {
if (strcmp(dmp->dm_name, name) == 0)
return (dmp);
}
if ((dmp = malloc(sizeof (dt_module_t))) == NULL)
return (NULL); /* caller must handle allocation failure */
bzero(dmp, sizeof (dt_module_t));
(void) strlcpy(dmp->dm_name, name, sizeof (dmp->dm_name));
dt_list_append(&dtp->dt_modlist, dmp);
dmp->dm_next = dtp->dt_mods[h];
dtp->dt_mods[h] = dmp;
dtp->dt_nmods++;
if (dtp->dt_conf.dtc_ctfmodel == CTF_MODEL_LP64)
dmp->dm_ops = &dt_modops_64;
else
dmp->dm_ops = &dt_modops_32;
/*
* Modules for userland processes are special. They always refer to a
* specific process and have a copy of their CTF data from a specific
* instant in time. Any dt_module_t that begins with 'pid' is a module
* for a specific process, much like how any probe description that
* begins with 'pid' is special. pid123 refers to process 123. A module
* that is just 'pid' refers specifically to pid$target. This is
* generally done as D does not currently allow for macros to be
* evaluated when working with types.
*/
if (strncmp(dmp->dm_name, "pid", 3) == 0) {
errno = 0;
if (dmp->dm_name[3] == '\0') {
idp = dt_idhash_lookup(dtp->dt_macros, "target");
if (idp != NULL && idp->di_id != 0)
dmp->dm_pid = idp->di_id;
} else {
pid = strtol(dmp->dm_name + 3, &eptr, 10);
if (errno == 0 && *eptr == '\0')
dmp->dm_pid = (pid_t)pid;
else
dt_dprintf("encountered malformed pid "
"module: %s\n", dmp->dm_name);
}
}
return (dmp);
}
示例11: dt_proc_rdwatch
static void
dt_proc_rdwatch(dt_proc_t *dpr, rd_event_e event, const char *evname)
{
rd_notify_t rdn;
rd_err_e err;
if ((err = rd_event_addr(dpr->dpr_rtld, event, &rdn)) != RD_OK) {
dt_dprintf("pid %d: failed to get event address for %s: %s\n",
(int)dpr->dpr_pid, evname, rd_errstr(err));
return;
}
if (rdn.type != RD_NOTIFY_BPT) {
dt_dprintf("pid %d: event %s has unexpected type %d\n",
(int)dpr->dpr_pid, evname, rdn.type);
return;
}
(void) dt_proc_bpcreate(dpr, rdn.u.bptaddr,
(dt_bkpt_f *)dt_proc_rdevent, (void *)evname);
}
示例12: dt_proc_rdevent
static void
dt_proc_rdevent(dtrace_hdl_t *dtp, dt_proc_t *dpr, const char *evname)
{
rd_event_msg_t rdm;
rd_err_e err;
if ((err = rd_event_getmsg(dpr->dpr_rtld, &rdm)) != RD_OK) {
dt_dprintf("pid %d: failed to get %s event message: %s\n",
(int)dpr->dpr_pid, evname, rd_errstr(err));
return;
}
dt_dprintf("pid %d: rtld event %s type=%d state %d\n",
(int)dpr->dpr_pid, evname, rdm.type, rdm.u.state);
switch (rdm.type) {
case RD_DLACTIVITY:
if (rdm.u.state != RD_CONSISTENT)
break;
Pupdate_syms(dpr->dpr_proc);
if (dt_pid_create_probes_module(dtp, dpr) != 0)
dt_proc_notify(dtp, dtp->dt_procs, dpr,
dpr->dpr_errmsg);
break;
case RD_PREINIT:
Pupdate_syms(dpr->dpr_proc);
dt_proc_stop(dpr, DT_PROC_STOP_PREINIT);
break;
case RD_POSTINIT:
Pupdate_syms(dpr->dpr_proc);
dt_proc_stop(dpr, DT_PROC_STOP_POSTINIT);
break;
}
// Take note of symbol owners (i.e. modules) already processed. */
if (!(dpr->dpr_stop & ~DT_PROC_STOP_IDLE))
Pcheckpoint_syms(dpr->dpr_proc);
}
示例13: dt_proc_attach
/*
* Common code for enabling events associated with the run-time linker after
* attaching to a process or after a victim process completes an exec(2).
*/
static void
dt_proc_attach(dt_proc_t *dpr, int exec)
{
const pstatus_t *psp = Pstatus(dpr->dpr_proc);
rd_err_e err;
GElf_Sym sym;
assert(DT_MUTEX_HELD(&dpr->dpr_lock));
if (exec) {
if (psp->pr_lwp.pr_errno != 0)
return; /* exec failed: nothing needs to be done */
dt_proc_bpdestroy(dpr, B_FALSE);
Preset_maps(dpr->dpr_proc);
}
if ((dpr->dpr_rtld = Prd_agent(dpr->dpr_proc)) != NULL &&
(err = rd_event_enable(dpr->dpr_rtld, B_TRUE)) == RD_OK) {
dt_proc_rdwatch(dpr, RD_PREINIT, "RD_PREINIT");
dt_proc_rdwatch(dpr, RD_POSTINIT, "RD_POSTINIT");
dt_proc_rdwatch(dpr, RD_DLACTIVITY, "RD_DLACTIVITY");
} else {
dt_dprintf("pid %d: failed to enable rtld events: %s\n",
(int)dpr->dpr_pid, dpr->dpr_rtld ? rd_errstr(err) :
"rtld_db agent initialization failed");
}
Pupdate_maps(dpr->dpr_proc);
if (Pxlookup_by_name(dpr->dpr_proc, LM_ID_BASE,
"a.out", "main", &sym, NULL) == 0) {
(void) dt_proc_bpcreate(dpr, (uintptr_t)sym.st_value,
(dt_bkpt_f *)dt_proc_bpmain, "a.out`main");
} else {
dt_dprintf("pid %d: failed to find a.out`main: %s\n",
(int)dpr->dpr_pid, strerror(errno));
}
}
示例14: dt_proc_bpdisable
static void
dt_proc_bpdisable(dt_proc_t *dpr)
{
dt_bkpt_t *dbp;
assert(DT_MUTEX_HELD(&dpr->dpr_lock));
for (dbp = dt_list_next(&dpr->dpr_bps);
dbp != NULL; dbp = dt_list_next(dbp)) {
if (dbp->dbp_active && Pdelbkpt(dpr->dpr_proc,
dbp->dbp_addr, dbp->dbp_instr) == 0)
dbp->dbp_active = B_FALSE;
}
dt_dprintf("breakpoints disabled\n");
}
示例15: dtrace_proc_waitfor
struct ps_prochandle *
dtrace_proc_waitfor(dtrace_hdl_t *dtp, char const *pname)
{
dt_ident_t *idp = dt_idhash_lookup(dtp->dt_macros, "target");
struct ps_prochandle *P = NULL;
int err;
dtrace_procdesc_t pdesc;
assert(dtp);
assert(pname);
assert(*pname != '\0');
size_t max_len = sizeof(pdesc.p_comm);
if (strlcpy(pdesc.p_comm, pname, max_len) >= max_len) {
fprintf(stderr, "Error, the process name (%s) exceeded the %lu characters limit\n",
pname, sizeof(pdesc.p_comm) - 1);
return NULL;
}
if ((err = dt_ioctl(dtp, DTRACEIOC_PROCWAITFOR, &pdesc)) != 0) {
fprintf(stderr, "Error, dt_ioctl() failed (%s)\n", strerror(errno));
return NULL;
}
assert(pdesc.p_pid != -1);
/*
* The process is already stopped by the previous ioctl call.
* The function dt_proc_grab() will stop and resume the process,
* but the process will remain stopped until we call pid_resume().
*/
P = dt_proc_grab(dtp, pdesc.p_pid, 0, 0);
/* Waking-up a process can fail if there is another client waiting for the same process. */
if ((err = pid_resume(pdesc.p_pid)) != 0) {
dt_dprintf("Unable to resume the process (pid=%d), the process is still suspended\n",
pdesc.p_pid);
}
if (P != NULL && idp != NULL && idp->di_id == 0)
idp->di_id = pdesc.p_pid; /* $target = grabbed pid */
return P;
}