我在Linux中玩ptrace。我正在尝试使用/ proc / pid / mem接口编写跟踪进程的内存。
我用来完成此任务的功能是:
void write_proc(pid_t child, unsigned long int addr) {
char mem_file_name[100];
char buf[10]="hope";
int mem_fd;
memset( (void*)mem_file_name, 0, 100);
memset( (void *)buf, 0, 10);
sprintf(mem_file_name, "/proc/%d/mem", child);
mem_fd = open(mem_file_name, O_RDONLY);
lseek(mem_fd, addr , SEEK_SET);
if (write(mem_fd, buf, 5) < 0 )
perror("Writing");
return;
}
但是我总是会得到错误:编写:错误的文件描述符。
是否可以使用此方法编写跟踪过程?
您正在以只读模式(O_RDONLY
)打开文件。我建议O_RDWR
改用:
mem_fd = open(mem_file_name, O_RDWR);
但是,从man proc
目前尚不清楚这是否可行:
/proc/[pid]/mem This file can be used to access the pages of a process's
memory
through open(2), read(2), and lseek(2).
编辑:
我也很好奇,所以我ptrace()
直接使用下面的示例:
#include <sys/ptrace.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define SHOW(call) ({ int _ret = (int)(call); printf("%s -> %d\n", #call, _ret); if (_ret < 0) { perror(NULL); }})
char changeme[] = "This is a test";
int main (void)
{
pid_t pid = fork();
int ret;
int i;
union {
char cdata[8];
int64_t data;
} u = { "Hijacked" };
switch (pid) {
case 0: /* child */
sleep(1);
printf("Message: %s\n", changeme);
exit(0);
case -1:
perror("fork");
exit(1);
break;
default: /* parent */
SHOW(ptrace(PTRACE_ATTACH, pid, 0, 0));
SHOW(ptrace(PTRACE_POKEDATA, pid, changeme, u.data));
SHOW(ptrace(PTRACE_CONT, pid, 0, 0));
wait(NULL);
break;
}
return 0;
}
如果用户把浏览器的Cookie功能关闭,或者浏览器不支持Cookie功能,那么SessionId就不能通过Cookie向服务端发送了。Servlet规范为了弥补这个不足,允许通过URL请求参数来发送SessionId。这样当浏览器的Cookie功能关闭时,在浏览器中仍然可以通过由URL请求参数发送的SessionId在服务端找到相应的HttpSession对象。 在下面的例子演示了如何通过URL的
跟踪行为控制着 Entity Framework Core 是否会在其变更跟踪器里维持实体实例的信息。如果实体是被跟踪的,任何检测到的该实体的变更都将在 SaveChanges() 时持久化到数据库中。Entity Framework Core 还会对已跟踪的、之前已加载到 DbContext 实例中的查询和实体进行相互的导航属性装配。 提示 你可以在 GitHub 上查阅当前文章涉及的代码样例。
由于Session是服务端对象,浏览器要想使用某个服务端的Session对象,就必须在请求消息中包含该Session对象的SessionID。该SessionID一般被放到HTTP请求消息头的Cookie字段中,Cookie名称是JSESSIONID。下面的例子揭示了通过Cookie来跟踪Session的底层技术,读者可以从该例子中充分了解Cookie和Session的关系。 例子 : 通过Coo
我试图了解C程序在汇编级别上的样子,所以我运行gdb并在主get_input上使用反汇编。该程序很短,因此我可以更好地遵循它。有2行我不明白。在 main() 中的第一个是:
问题内容: 我有一个执行一些模拟并以字符串格式返回数组的函数。 我想运行模拟(函数)以更改输入参数值(超过10000个可能的输入值),并将结果写入单个文件。 我正在使用多重处理,特别是pool.map函数来并行运行模拟。 由于运行仿真功能超过10000次的整个过程需要很长时间,因此我真的很想跟踪整个操作的过程。 我认为下面我当前代码中的问题是,pool.map运行该函数10000次,在这些操作过程
问题内容: 在不让父进程等待子进程被杀死的情况下,我如何跟踪子进程的死亡? 我正在尝试一个客户端-服务器方案,其中服务器从客户端接受连接,并为它接受的每个连接派生一个新进程。 我忽略了SIGCHLD信号以防止僵尸创建。 上述情况下的问题是,如果子进程在函数中被杀死,则全局变量不会递减。 注意: 我正在寻找不使用SIGCHLD信号的解决方案…如果可能 问题答案: 通常,您编写一个调用pid 的处理程