我正在尝试将一个程序从Windows移植到Linux。
当我发现Linux上没有一个“真正的”
在使用它之前,我快速编写了两个小的控制台应用程序来测试
一切正常,但是TestApp被暂停(SIGSTOP),直到
此外,当它附加到进程时,状态为0,错误为2;第一次尝试检索内存地址值时,状态为-1,错误为3。这是正常的吗?
有没有办法防止ptrace向进程发送SIGSTOP信号? 我已经尝试使用
当我发现Linux上没有一个“真正的”
ReadProcessMemory
对应项时,我遇到了一个问题;我搜索了一个替代方案,找到了一个强大的进程调试器ptrace
。在使用它之前,我快速编写了两个小的控制台应用程序来测试
ptrace
。
TestApp
这是被跟踪的程序。它每50毫秒打印两个整数,并在每次打印时将它们的值增加1。
#include <QCoreApplication>
#include <QThread>
#include <iostream>
using namespace std;
class Sleeper : public QThread
{
public:
static void usleep(unsigned long usecs){QThread::usleep(usecs);}
static void msleep(unsigned long msecs){QThread::msleep(msecs);}
static void sleep(unsigned long secs){QThread::sleep(secs);}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int value = 145;
int i = 0;
do {
cout << "i: " << i << " " << "Value: " << value << endl;
value++;
i++;
Sleeper::msleep(50);
} while (true);
return a.exec();
}
内存测试
这是一个跟踪器;它会要求进程名称并使用命令pidof -s
检索PID,然后ptrace
附加到进程并每500毫秒检索一次内存地址的值,共10次。
#include <QCoreApplication>
#include <QThread>
#include <iostream>
#include <string>
#include <sys/ptrace.h>
#include <errno.h>
using namespace std;
class Sleeper : public QThread
{
public:
static void usleep(unsigned long usecs){QThread::usleep(usecs);}
static void msleep(unsigned long msecs){QThread::msleep(msecs);}
static void sleep(unsigned long secs){QThread::sleep(secs);}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
char process_name[50];
cout << "Process name: ";
cin >> process_name;
char command[sizeof(process_name) + sizeof("pidof -s ")];
snprintf(command, sizeof(command), "pidof -s %s", process_name);
FILE* shell = popen(command, "r");
char pidI[sizeof(shell)];
fgets(pidI, sizeof(pidI), shell);
pclose(shell);
pid_t pid = atoi(pidI);
cout << "The PID is " << pid << endl;
long status = ptrace(PTRACE_ATTACH, pid, NULL, NULL);
cout << "Status: " << status << endl;
cout << "Error: " << errno << endl;
unsigned long addr = 0x012345; // Example address, not the true one
int i = 0;
do {
status = ptrace(PTRACE_PEEKDATA, pid, addr, NULL);
cout << "Status: " << status << endl;
cout << "Error: " << errno << endl;
i++;
Sleeper::msleep(500);
} while (i < 10);
status = ptrace(PTRACE_DETACH, pid, NULL, NULL);
cout << "Status: " << status << endl;
cout << "Error: " << errno << endl;
return a.exec();
}
一切正常,但是TestApp被暂停(SIGSTOP),直到
ptrace
从中分离出来。此外,当它附加到进程时,状态为0,错误为2;第一次尝试检索内存地址值时,状态为-1,错误为3。这是正常的吗?
有没有办法防止ptrace向进程发送SIGSTOP信号? 我已经尝试使用
PTRACE_SEIZE
而不是PTRACE_ATTACH
,但它不起作用:状态为-1,错误为3。
更新:在“do-while”循环之前在MemoryTest中使用Sleeper可以解决第一个内存地址值检索的问题,即使秒、毫秒或微秒的值为0。为什么?
[stack]
。例如,该行可能是:7ffd44730000-7ffd44751000 rw-p 00000000 00:00 0 [stack]
这两个地址(分别为开始和结束)定义了可用于指定模块(在此情况下为堆栈)的内存区域。您可以使用process_vm_readv()
读取该区域。 - Davide Beatriciptrace()
,但只有在进行syscall
时才会使用,它会使进程变慢一些,但由于我们正在调试,我想这是公平的。我现在正在尝试制作自己的版本的strace
,以便它可以在嵌入式系统上工作,这将需要进行新的研究。 - Mohit Sharma