我是靠谱客的博主 爱笑小蘑菇,最近开发中收集的这篇文章主要介绍linux打出某一进程的堆栈,如何在Linux上使用Ptrace打印C ++其他进程的调用堆栈,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#include

#include

#include

#include

#define BUFSIZ 1024

#define MAXPATH 1024

pid_t npid, cpid, pid;

int status, errors=0, pathlength;

ptrace_event_t *event_addr;

ptrace_state_t *state_addr;

char *buf_addr;

size_t event_len, state_len;

int filed[2];

child()

{

int n, bar;

close(filed[1]);

/* Wait for parent to write to pipe */

while ((n = read(filed[0], &bar, BUFSIZ)) == 0);

/* Now the child can exec. */

if (execlp("ls", "ls", (char *)0) < 0) /* error during exec */

printf("Child: exec failedn");

exit(0);

}

parent()

{

close(filed[0]);

/* Before child does an exec, attach it and set its event flag. */

if (ptrace(PT_ATTACH,pid)) /* failed to attach process */

printf("Parent: Failed to attach childn");

if (pid != wait(&status)) /* wait failed */

printf("Parent: attach failed with wrong wait statusn");

if (!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP))

printf("Parent: SIGTRAP didn't stop childn");

/*

* The child process has now stopped. Set its event flag indicating

* that it needs to trigger on a PTRACE_EXEC event.

*/

event_addr->pe_set_event = PTRACE_EXEC;

if (ptrace(PT_SET_EVENT_MASK, pid, event_addr, event_len))

printf("Parent: PT_SET_EVENT_MASK ptrace request failedn");

if (pid != wait(&status)) /* wait failed */

printf("Parent: wait() failed with wrong wait statusn");

/*

* Send the child a message so it can break out of the while loop.

* Get it running so it can exec.

*/

write(filed[1], "now run", 7);

if (ptrace(PT_CONTIN, pid, 1, 0) != 0)

printf("Parent: failed to get child process runningn");

/*

* Wait for the traced child to stop after the exec system call in

* response to an exec event set in its ptrace_event structure.

*/

if (pid != (npid = wait(&status))) /* wait failed */

printf("Parent: wait() failed with wrong statusn");

if (!WIFSTOPPED(status))

printf("Parent: invalid wait() completionn");

/*

* Child has stopped; fetch its process state and examine state

* information.

*/

if (ptrace(PT_GET_PROCESS_STATE, pid, state_addr, state_len) < 0)

printf("Parent: PT_GET_PROCESS_STATE ptrace request failedn");

if (pid != wait(&status)) /* wait failed */

printf("Parent: wait() failed with wrong wait statusn");

/* Check if the pathlength value returned is non-zero */

if ((pathlength = state_addr->pe_path_len) == 0)

printf("Parent: zero length pathname returnedn");

/* Fetch exec'd file pathname and store it in the buffer. */

if (ptrace(PT_GET_PROCESS_PATHNAME, pid, buf_addr, (pathlength+1))

< 0){

printf("Parent: Failed to get exec pathnamen");

} else {

printf("Parent: the exec pathname is %sn", buf_addr);

if (pid != wait(&status)) /* wait failed */

printf("Parent: wait() failed with wrong statusn");

}

}

main()

{

event_len = sizeof(ptrace_event_t);

state_len = sizeof(ptrace_state_t);

event_addr = calloc(event_len, 1);

state_addr = calloc(state_len, 1);

buf_addr = calloc(MAXPATH, 1);

pipe(filed);

switch (pid = fork()) {

case -1:

exit(1);

case 0:

child();

break;

default:

parent();

break;

}

}

最后

以上就是爱笑小蘑菇为你收集整理的linux打出某一进程的堆栈,如何在Linux上使用Ptrace打印C ++其他进程的调用堆栈的全部内容,希望文章能够帮你解决linux打出某一进程的堆栈,如何在Linux上使用Ptrace打印C ++其他进程的调用堆栈所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部