Print this page
8158 Want named threads API
9857 proc manpages should have LIBRARY section


1286         mdb_tgt_t *t = mdb.m_target;
1287 
1288         if (t->t_pshandle != NULL) {
1289                 const pstatus_t *psp = Pstatus(t->t_pshandle);
1290                 int cursig = psp->pr_lwp.pr_cursig;
1291                 char signame[SIG2STR_MAX];
1292                 int state = Pstate(t->t_pshandle);
1293 
1294                 if (state != PS_DEAD && state != PS_IDLE)
1295                         mdb_printf("process id = %d\n", psp->pr_pid);
1296                 else
1297                         mdb_printf("no process\n");
1298 
1299                 if (cursig != 0 && sig2str(cursig, signame) == 0)
1300                         mdb_printf("SIG%s: %s\n", signame, strsignal(cursig));
1301         }
1302 
1303         return (pt_regs(addr, flags, argc, argv));
1304 }
1305 

















1306 static int
1307 pt_findstack(uintptr_t tid, uint_t flags, int argc, const mdb_arg_t *argv)
1308 {
1309         mdb_tgt_t *t = mdb.m_target;
1310         mdb_tgt_gregset_t gregs;
1311         int showargs = 0;
1312         int count;
1313         uintptr_t pc, sp;

1314 
1315         if (!(flags & DCMD_ADDRSPEC))
1316                 return (DCMD_USAGE);
1317 
1318         count = mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &showargs,
1319             NULL);
1320         argc -= count;
1321         argv += count;
1322 
1323         if (argc > 1 || (argc == 1 && argv->a_type != MDB_TYPE_STRING))
1324                 return (DCMD_USAGE);
1325 
1326         if (PTL_GETREGS(t, tid, gregs.gregs) != 0) {
1327                 mdb_warn("failed to get register set for thread %p", tid);
1328                 return (DCMD_ERR);
1329         }
1330 
1331         pc = gregs.gregs[R_PC];
1332 #if defined(__i386) || defined(__amd64)
1333         sp = gregs.gregs[R_FP];
1334 #else
1335         sp = gregs.gregs[R_SP];
1336 #endif
1337         mdb_printf("stack pointer for thread %p: %p\n", tid, sp);



1338         if (pc != 0)
1339                 mdb_printf("[ %0?lr %a() ]\n", sp, pc);
1340 
1341         (void) mdb_inc_indent(2);
1342         mdb_set_dot(sp);
1343 
1344         if (argc == 1)
1345                 (void) mdb_eval(argv->a_un.a_str);
1346         else if (showargs)
1347                 (void) mdb_eval("<.$C");
1348         else
1349                 (void) mdb_eval("<.$C0");
1350 
1351         (void) mdb_dec_indent(2);
1352         return (DCMD_OK);
1353 }
1354 
1355 /*ARGSUSED*/
1356 static int
1357 pt_gcore(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)




1286         mdb_tgt_t *t = mdb.m_target;
1287 
1288         if (t->t_pshandle != NULL) {
1289                 const pstatus_t *psp = Pstatus(t->t_pshandle);
1290                 int cursig = psp->pr_lwp.pr_cursig;
1291                 char signame[SIG2STR_MAX];
1292                 int state = Pstate(t->t_pshandle);
1293 
1294                 if (state != PS_DEAD && state != PS_IDLE)
1295                         mdb_printf("process id = %d\n", psp->pr_pid);
1296                 else
1297                         mdb_printf("no process\n");
1298 
1299                 if (cursig != 0 && sig2str(cursig, signame) == 0)
1300                         mdb_printf("SIG%s: %s\n", signame, strsignal(cursig));
1301         }
1302 
1303         return (pt_regs(addr, flags, argc, argv));
1304 }
1305 
1306 static void
1307 pt_thread_name(mdb_tgt_t *t, mdb_tgt_tid_t tid, char *buf, size_t bufsize)
1308 {
1309         char name[THREAD_NAME_MAX];
1310 
1311         buf[0] = '\0';
1312 
1313         if (t->t_pshandle == NULL ||
1314             Plwp_getname(t->t_pshandle, tid, name, sizeof (name)) != 0 ||
1315             name[0] == '\0') {
1316                 (void) mdb_snprintf(buf, bufsize, "%lu", tid);
1317                 return;
1318         }
1319 
1320         (void) mdb_snprintf(buf, bufsize, "%lu [%s]", tid, name);
1321 }
1322 
1323 static int
1324 pt_findstack(uintptr_t tid, uint_t flags, int argc, const mdb_arg_t *argv)
1325 {
1326         mdb_tgt_t *t = mdb.m_target;
1327         mdb_tgt_gregset_t gregs;
1328         int showargs = 0;
1329         int count;
1330         uintptr_t pc, sp;
1331         char name[128];
1332 
1333         if (!(flags & DCMD_ADDRSPEC))
1334                 return (DCMD_USAGE);
1335 
1336         count = mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &showargs,
1337             NULL);
1338         argc -= count;
1339         argv += count;
1340 
1341         if (argc > 1 || (argc == 1 && argv->a_type != MDB_TYPE_STRING))
1342                 return (DCMD_USAGE);
1343 
1344         if (PTL_GETREGS(t, tid, gregs.gregs) != 0) {
1345                 mdb_warn("failed to get register set for thread %p", tid);
1346                 return (DCMD_ERR);
1347         }
1348 
1349         pc = gregs.gregs[R_PC];
1350 #if defined(__i386) || defined(__amd64)
1351         sp = gregs.gregs[R_FP];
1352 #else
1353         sp = gregs.gregs[R_SP];
1354 #endif
1355 
1356         pt_thread_name(t, tid, name, sizeof (name));
1357 
1358         mdb_printf("stack pointer for thread %s: %p\n", name, sp);
1359         if (pc != 0)
1360                 mdb_printf("[ %0?lr %a() ]\n", sp, pc);
1361 
1362         (void) mdb_inc_indent(2);
1363         mdb_set_dot(sp);
1364 
1365         if (argc == 1)
1366                 (void) mdb_eval(argv->a_un.a_str);
1367         else if (showargs)
1368                 (void) mdb_eval("<.$C");
1369         else
1370                 (void) mdb_eval("<.$C0");
1371 
1372         (void) mdb_dec_indent(2);
1373         return (DCMD_OK);
1374 }
1375 
1376 /*ARGSUSED*/
1377 static int
1378 pt_gcore(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)