//------------------------------------------------------------------------------ // Name: // Desc: //------------------------------------------------------------------------------ edb::address_t PlatformThread::instruction_pointer() const { struct user_stat thread_stat; int n = get_user_stat(QString("/proc/%1/task/%2/stat").arg(process_->pid()).arg(tid_), &thread_stat); if(n >= 18) { return thread_stat.kstkeip; } return 0; }
//------------------------------------------------------------------------------ // Name: // Desc: //------------------------------------------------------------------------------ int PlatformThread::priority() const { struct user_stat thread_stat; int n = get_user_stat(QString("/proc/%1/task/%2/stat").arg(process_->pid()).arg(tid_), &thread_stat); if(n >= 30) { return thread_stat.priority; } return 0; }
//------------------------------------------------------------------------------ // Name: // Desc: //------------------------------------------------------------------------------ QString PlatformThread::name() const { struct user_stat thread_stat; int n = get_user_stat(QString("/proc/%1/task/%2/stat").arg(process_->pid()).arg(tid_), &thread_stat); if(n >= 2) { return thread_stat.comm; } return QString(); }
//------------------------------------------------------------------------------ // Name: // Desc: //------------------------------------------------------------------------------ edb::pid_t DebuggerCore::parent_pid(edb::pid_t pid) const { struct user_stat user_stat; int n = get_user_stat(pid, &user_stat); if(n >= 4) { return user_stat.ppid; } return 0; }
//------------------------------------------------------------------------------ // Name: // Desc: //------------------------------------------------------------------------------ QString PlatformThread::runState() const { struct user_stat thread_stat; int n = get_user_stat(QString("/proc/%1/task/%2/stat").arg(process_->pid()).arg(tid_), &thread_stat); if(n >= 3) { switch(thread_stat.state) { // 03 case 'R': return tr("%1 (Running)").arg(thread_stat.state); break; case 'S': return tr("%1 (Sleeping)").arg(thread_stat.state); break; case 'D': return tr("%1 (Disk Sleep)").arg(thread_stat.state); break; case 'T': return tr("%1 (Stopped)").arg(thread_stat.state); break; case 't': return tr("%1 (Tracing Stop)").arg(thread_stat.state); break; case 'Z': return tr("%1 (Zombie)").arg(thread_stat.state); break; case 'X': case 'x': return tr("%1 (Dead)").arg(thread_stat.state); break; case 'W': return tr("%1 (Waking/Paging)").arg(thread_stat.state); break; case 'K': return tr("%1 (Wakekill)").arg(thread_stat.state); break; case 'P': return tr("%1 (Parked)").arg(thread_stat.state); break; default: return tr("%1").arg(thread_stat.state); break; } } return tr("Unknown"); }
//------------------------------------------------------------------------------ // Name: get_user_stat // Desc: gets the contents of /proc/<pid>/stat and returns the number of elements // successfully parsed //------------------------------------------------------------------------------ int get_user_stat(edb::pid_t pid, struct user_stat *user_stat) { return get_user_stat(QString("/proc/%1/stat").arg(pid), user_stat); }