我把指针移到内存的开头p = 0,增加它,记住(noerr)没有错误发生的时刻。然后我寻找错误再次出现的时刻(err)。[noerr; err)原来是程序在内存区间。但是代码在第一次迭代时就已经崩溃了。
Ошибка сегментирования (сделан дамп памяти)
编码:
#include <iostream>
using namespace std;
int main()
{
char *p = 0, *noerr = 0, *err = 0;
while (1) {
try {
char c = *p;
if (!noerr) {
noerr = p;
cout << "noerr: " << (int)noerr << endl;
}
} catch (...) {
p++;
if (noerr) {
err = p;
cout << "err: " << (int)err << endl;
break;
}
}
}
}
为什么try/catch它不捕获错误?我怎样才能修复该程序,使其按我的预期工作?
操作系统:Linux。
解决方案
main.cpp:
#include <iostream>
#include <csignal>
#include <cstdio>
#include <cstdlib>
#include <fstream>
using namespace std;
int main();
char *begin_ptr;
void find_begin() {
char *p = (char*) main;
while (1) {
begin_ptr = p;
char c = *(--p);
}
}
void find_end() {
char *p = (char*) main;
while (1) {
ofstream f("end.txt");
f << (int) p;
f.close();
char c = *(++p);
}
}
void sig_handler(int signo) {
ofstream f("begin.txt");
f << (int) begin_ptr;
f.close();
cout << "Signal " << signo << endl;
cout << "begin_ptr: " << (int) begin_ptr << endl;
cout << "dist from begin to main: " << ((char*)main - begin_ptr) << endl;
find_end();
exit(0);
}
void HandlerRun () {
printf("Sig Handle Initialized!\n");
signal(SIGSEGV, sig_handler);
signal(SIGSTOP, sig_handler);
signal(SIGTERM, sig_handler);
// signal(SIGKILL, sig_handler);
signal(SIGABRT, sig_handler);
signal(SIGINT , sig_handler);
}
int main() {
HandlerRun();
ofstream f("main.txt");
f << (int) main;
f.close();
cout << "main: " << (int) main << endl;
find_begin();
}
main.sh:
./main > /dev/null
beg=$(cat begin.txt)
end=$(cat end.txt)
echo begin: $beg
echo end: $end
echo end - begin: $(echo $end - $beg | bc)
输出示例:
begin: 134512640
end: 134529023
end - begin: 16383
如果你的程序有 pid == PID,那么最详细的内存映射位于文件中
可以通过调用函数获取pid值