102 lines
2.6 KiB
C++
102 lines
2.6 KiB
C++
#include <errno.h>
|
||
#include <fcntl.h>
|
||
#include <stdio.h>
|
||
#include <sys/ioctl.h>
|
||
#include <unistd.h>
|
||
|
||
#include "ucli.h"
|
||
#include "symbol.h"
|
||
|
||
/**
|
||
* @brief 调用ioctl
|
||
*/
|
||
long diag_call_ioctl(unsigned long request, unsigned long arg) {
|
||
long ret = 0;
|
||
int fd;
|
||
|
||
fd = open(DEVICE, O_RDWR, 0);
|
||
if (fd < 0) {
|
||
printf("open %s error!\n", DEVICE);
|
||
return -EEXIST;
|
||
}
|
||
|
||
ret = ioctl(fd, request, arg);
|
||
if (ret < 0) {
|
||
printf("call cmd %lx fail, ret is %ld\n", request, ret);
|
||
goto err;
|
||
}
|
||
|
||
err:
|
||
close(fd);
|
||
return ret;
|
||
}
|
||
|
||
void extract_variant_buffer(char *buf, unsigned int len,
|
||
int (*func)(void *, unsigned int, void *),
|
||
void *arg) {
|
||
unsigned int pos = 0;
|
||
struct diag_variant_buffer_head *head;
|
||
void *rec;
|
||
int rec_len;
|
||
char *ret;
|
||
char dir[1024] = {0};
|
||
|
||
ret = getcwd(dir, sizeof(dir));
|
||
|
||
while (pos < len) {
|
||
head = (struct diag_variant_buffer_head *)(buf + pos);
|
||
if (pos + sizeof(struct diag_variant_buffer_head) >= len) break;
|
||
if (head->magic != DIAG_VARIANT_BUFFER_HEAD_MAGIC_SEALED) break;
|
||
if (head->len < sizeof(struct diag_variant_buffer_head)) break;
|
||
|
||
rec = (void *)(buf + pos + sizeof(struct diag_variant_buffer_head));
|
||
rec_len = head->len - sizeof(struct diag_variant_buffer_head);
|
||
func(rec, rec_len, arg);
|
||
|
||
pos += head->len;
|
||
}
|
||
|
||
if (ret) {
|
||
(void)chdir(dir);
|
||
}
|
||
}
|
||
|
||
void printk_task_brief(struct diag_task_detail *detail) {
|
||
printk(" 进程信息: [%s / %s], PID: %d / %d\n", detail->cgroup_buf,
|
||
detail->comm, detail->tgid, detail->pid);
|
||
}
|
||
|
||
void diag_printf_kern_stack(kern_stack_detail *kern_stack, int reverse) {
|
||
int i;
|
||
symbol sym;
|
||
|
||
printf(" 内核态堆栈:\n");
|
||
if (reverse) {
|
||
for (i = BACKTRACE_DEPTH - 1; i >= 0; i--) {
|
||
if (kern_stack->stack[i] == (size_t)-1 || kern_stack->stack[i] == 0) {
|
||
continue;
|
||
}
|
||
sym.reset(kern_stack->stack[i]);
|
||
if (g_symbol_parser.find_kernel_symbol(sym)) {
|
||
printf("#@ 0x%lx %s ([kernel.kallsyms])\n", kern_stack->stack[i],
|
||
sym.name.c_str());
|
||
} else {
|
||
printf("#@ 0x%lx %s\n", kern_stack->stack[i], "UNKNOWN");
|
||
}
|
||
}
|
||
} else {
|
||
for (i = 0; i < BACKTRACE_DEPTH; i++) {
|
||
if (kern_stack->stack[i] == (size_t)-1 || kern_stack->stack[i] == 0) {
|
||
break;
|
||
}
|
||
sym.reset(kern_stack->stack[i]);
|
||
if (g_symbol_parser.find_kernel_symbol(sym)) {
|
||
printf("#@ 0x%lx %s ([kernel.kallsyms])\n", kern_stack->stack[i],
|
||
sym.name.c_str());
|
||
} else {
|
||
printf("#@ 0x%lx %s\n", kern_stack->stack[i], "UNKNOWN");
|
||
}
|
||
}
|
||
}
|
||
}
|