打印某个进程的执行栈
来源:互联网 发布:mac os官方壁纸 编辑:程序博客网 时间:2024/05/21 22:57
现成的方法有pstack或者使用gdb -p,一般用于查找进程堵塞或者CPU占用过高时的堆栈。
基本原理是通过ptrace到某个进程获取其寄存器的BP值,依次推导出整个执行栈
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <linux/user.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/wait.h>
extern int errno;
static inline int attachproccess(int process)
{
if (-1 == ptrace((enum __ptrace_request)PTRACE_ATTACH, process, NULL, NULL))
{
printf("[%s:%d] attach process %d failed : %s /n", __FILE__, __LINE__, process, strerror(errno));
return -1;
}
int status;
if (-1 == wait(&status))
{
printf("[%s:%d] wait process %d failed : %s /n", __FILE__, __LINE__, process, strerror(errno));
return -1;
}
if(WIFEXITED(status))
{
printf("[%s:%d] process %d exit", __FILE__, __LINE__, process);
return -1;
}
#ifdef _DDEBUG
printf("[%s:%d] attach process success /n", __FILE__, __LINE__);
#endif
struct user_regs_struct regs;
if (-1 == ptrace((enum __ptrace_request)PTRACE_GETREGS, process, NULL, ®s))
{
printf("[%s:%d] get process %d registers failed : %s /n", __FILE__, __LINE__, process, strerror(errno));
return -1;
}
printf("EIP: %04x /n", regs.eip);
int ebp = regs.ebp;
printf("ReturnAddress: %04x /n", ptrace((enum __ptrace_request)PTRACE_PEEKDATA, process, ebp+4, NULL));
while (ebp < 0xbfffffff)
{
ebp = ptrace((enum __ptrace_request)PTRACE_PEEKDATA, process, ebp, NULL);
if (0 != ebp)
{
printf("ReturnAddress: %04x /n", ptrace((enum __ptrace_request)PTRACE_PEEKDATA, process, ebp+4, NULL));
continue;
}
break;
}
if (-1 == ptrace((enum __ptrace_request)PTRACE_DETACH, process, NULL, NULL))
{
printf("[%s:%d] detach process %d failed : %s /n", __FILE__, __LINE__, process, strerror(errno));
}
return 0;
}
int main(int args, char** argv)
{
int iProcessId;
if (2 != args)
{
goto ParamError;
}
iProcessId = strtol(argv[1], NULL, 0);
if (LONG_MAX == iProcessId)
{
goto ParamError;
}
else if (LONG_MIN == iProcessId)
{
goto ParamError;
}
else
{
attachproccess(iProcessId);
return 0;
}
ParamError:
printf("please input process id with integer!!");
return -1;
}
- 打印某个进程的执行栈
- Android手机查看某个烦人的进程日志是哪个打印的
- 循环不断打印出Android系统中某个进程的内存使用情况
- 【SHELL】使用ps如何准确地打印出某个用户的进程
- 打印某个月份的日历表!
- linux 打印相关 应用的进程,根据筛选条件 获取进程id 执行jstack 指令
- 删除所有链接\批量删除DB\查询某个用户进程ID执行的操作
- 删除所有链接\批量删除DB\查询某个用户进程ID执行的操作
- 杀死某个名称的进程
- python 监控某个进程的进程数
- 检测某个程序是否在进程中执行
- python 绑定进程在某个cpu上执行-affinity
- python 绑定进程在某个cpu上执行 affinity
- 命令行打印某个程序的socket信息
- js 控制打印某个 div 的内容
- python递归打印某个目录的内容
- 使用wscript.exe实现kill某个进程,用户无任何感知,不会弹出任何命令的执行窗口
- 进程的执行过程
- JScript是JavaScript缩写吗?
- 深入浅出MFC文档/视图架构之相互关系1
- C#文件操作
- 数据类型及其相互关系
- 在eclipse中建立tld
- 打印某个进程的执行栈
- 错误21002:[SQL-DMO]用户"xxx"已经存在
- 深入浅出MFC文档/视图架构之相互关系(2)
- 我想去种树
- 深度解析VC中的消息传递机制(转)
- 涨涨落落
- 深入浅出MFC文档/视图架构之视图
- fileupload 预览[转]
- SQL server日志文件的清空