Articles of 内存

分段错误无效内存0x0

我有一个指向结构variables的指针问题。 我刚开始使用GDB来debugging问题。 由于分段错误,应用程序在遇到下面的代码行时停止。 ptr_var是一个指向结构的指针 ptr_var->page = 0; 我发现ptr_var被设置为一个无效的内存0x0后,一系列的函数调用,当分配值为“0”结构成员“页”导致分段错误。 这一系列函数调用没有对ptr_var的引用。 过去分配给ptr_var的旧地址仍在内存中。 我仍然可以使用旧地址从结构ptr_var中打印成员的值。 下面的GDB会话显示,我正在使用它的地址打印struct ptr_var的string成员 (gdb) x /s *0x7e11c0 0x7e0810: "Sample String" 我不知道什么时候variablesptr_var被分配了一个无效的地址0x0。 我是GDB和普通C程序员的新手。 在这个问题上的帮助是非常感谢。 谢谢。

Linux:有没有办法使用ptrace而不停止/暂停进程(SIGSTOP)?

我试图将一个程序从Windows移植到Linux。 当我发现Linux上没有“真正的” ReadProcessMemory对应项时,遇到了一个问题。 我寻找一个替代品,我发现ptrace ,一个强大的stream程debugging器。 我在C ++中快速地编写了两个小控制台应用程序来testingptrace ,然后在程序中使用它。 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 = […]

使用C从Linux中的现有文件获取硬件信息

我使用execv运行lshw命令来获取C代码中的CPU,磁盘和内存。 但我想寻找另一个解决scheme来从/proc或任何其他现有的数据获取这些信息。 有什么build议吗? 这是我的代码: char *params[9] = {"/usr/bin/lshw", "-short", "-c", "disk", "-c", "memory", "-c", "processor", 0}; //cmd params filled execv(params[0], params); Linux命令: $ sudo lshw -short -c disk -c processor -c memory $ sudo lshw -short -c disk -c processor -c memory H/W path Device Class Description ====================================================== /0/0 memory 64KiB BIOS /0/22 memory 16GiB […]

当使用'push'或'sub'x86指令时如何分配堆栈内存?

我一直在浏览一段时间,我想了解如何将内存分配给堆栈时,例如: push rax 或者移动堆栈指针来为子例程的局部variables分配空间: sub rsp, X ;Move stack pointer down by X bytes 我所理解的是,在虚拟内存空间中,堆栈段是匿名的,即不支持文件。 我也明白,内核实际上不会将匿名的虚拟内存段映射到物理内存,直到程序实际上对内存段做某事,即写入数据。 所以,在写入之前尝试读取该段可能会导致错误。 在第一个例子中,如果需要,内核将在物理内存中分配一个帧页面。 在第二个例子中,我假定内核不会将任何物理内存分配给堆栈段,直到程序实际将数据写入堆栈堆栈段中的地址为止。 我在这里的正确轨道?

LINUX中的内存故障错误,但不是在UNIX中

我们正在运行一个叫做ProC程序的ksh脚本来更新表格。 该程序在UNIX中成功运行,但是当我们在LINUX RHEL55中运行它时,会导致内存错误错误当我们试图debugging内存错误之前的最后一条语句的位置时,它指向在我们对光标执行Fetch并尝试使用获取的值来更新表格这里是代码片段 #define PROGRAM "n377wlocgeo" /* name of this program */ #define USERNAME "/" /* ORACLE username */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> /* Include the ORACLE communication Area, a structure through which ORACLE makes additional runtime Status available to the program The ORACA=YES must be specified to enable use of […]

为什么Java在我的Linux服务器上使用更多内存?

我有两个Java程序。 在我的电脑上,其中一个使用9MB的RAM,另一个使用77MB。 但是当我把它们上传到服务器时,同样的程序使用382MB和186MB! 有没有办法阻止这种情况发生?

内存映射对象在线程终止后会自动释放吗?

我有几个简单的问题。 如果我在C中创build一个新的子线程,在线程完成处理并终止之后,执行: 内存映射对象“自动”释放? (我知道C没有垃圾收集器,但此时孩子已经终止) 猜猜我贴得太快了。 find第二个问题的答案(供将来参考): http : //www.ibm.com/developerworks/linux/library/l-memory-leaks/index.html? ca= drs- 孩子可以返回一个值父线程? (这是否可以使用一些常见的例程?我知道孩子和父母的内存空间是相同的?) 另外我想提一下,操作系统是符合POSIX的。 谢谢,Neco

在静态库中查找静态分配的数据块

我有一个小的静态库( .a )。 在静态库中是一个指向一个大的,静态分配的一维数组的指针。 当我将代码链接到这个库时,指针的地址在各个位置被硬编码,通过反汇编很容易find。 问题是,我想我的代码能够访问这个数组(图书馆是错误的,我想知道为什么)。 当然,通过反汇编,将该地址硬编码到我的代码中,然后重新编译,这将是微不足道的。 这不会是一个问题,除了库可以用不同的方式configuration其他模块,并且数组的指针根据链接的模块而改变。 我有什么select获得该指针? 因为数组的起始状态是可预测的,所以我可以遍历内存,用信号处理程序捕捉段错误,直到find合理的东西。 有没有更好的办法?

我怎样才能得到我的程序的内存消耗高峰?

我有一个小程序,就像grep或cat在运行时分配内存一样。 我想知道在整个运行过程中最多分配了多less内存。 我怎么能这样做?

为什么Linux中的物理内存被分配线性增加而不是一次?

我写了一个如下的程序,一次分配了大约1.2G的内存,我在Linux上testing过。 然后我发现 如果我定义了macros* WRITE_MEM *,则物理内存使用率(由命令顶部检查)将线性增加。 如果我没有定义这个macros,那么物理内存的使用量非常小(大约几百KB),而且不会变大。 我不明白这个现象。 #include <iostream> #include <cmath> #include <cstdlib> using namespace std; float sum = 0.; int main (int argc, char** argv) { float* pf = (float*) malloc(1024*1024*300*4); float* p = pf; for (int i = 0; i < 300; i++) { cout << i << "…" << endl; float* qf […]