问题标签 [brk]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1195 浏览

php - 长时间运行的进程调试。Strace, brk

我有 Magento 网上商店,它运行 cron 作业来执行预定的进程。其中之一是产品进口。它负责导入产品并将它们分配给类别。根据 sql state 我可以看到这部分已经完成。在它尝试使缓存无效之后。对于缓存,我尝试在 tcp 上使用 memcache 或在套接字上使用 redis。对于这两个选项,我有相同的结果。我使用 strace 命令来查看它正在尝试做什么。

过去 2 小时的输出是:

我知道 brk 是用来分配内存的。

其他输出可能意味着什么?这种行为的原因是什么?有任何想法吗?

0 投票
1 回答
562 浏览

linux - 当我使用 brk 系统调用时,我分配的内存实际上从哪里开始

我正在尝试在 NASM/x86 程序集中使用 sys_brk 分配一些内存。sys_break 返回break的新地址,是数据段的末尾吧?那么我新分配的内存在哪里呢?我假设它介于旧中断值和新中断值之间。因此,如果我使用 sys_brk 分配 64 字节的内存,我可以使用从调用 sys_brk 之前存储的旧中断值开始的接下来的 64 字节。我对吗?

我将分配内存的汇编代码看起来有点像这样。https://gist.github.com/nikAizuddin/f4132721126257ec4345

另一个问题是;

我应该在 Assembly 中编写一个函数,该函数返回指向动态分配内存的指针,并且该函数将从 C 程序中调用。如何从程序的 C 端释放这块内存?只调用 free() 就足够了吗?

0 投票
2 回答
644 浏览

linux - 如何找到程序中断的当前位置

我尝试在 brk 系统调用函数中添加它:

但它在内核编译期间返回错误,即隐式声明 sbrk 函数。而且我找不到定义 sbrk 的位置!!我需要测量的是,每当某个用户进程试图扩展它的程序中断地址时,我就会知道它当前的程序中断地址,这样我就可以测量有多少内存进程正在请求。

谢谢你。

0 投票
1 回答
188 浏览

linux - 在 i386 Linux 上的汇编中提高 BRK

我发现并研究了x86 内存访问分段错误,它在我的代码中不起作用。不同之处可能在于我不使用单独的 .text 和 .data 段,而是通过创建自定义 ELF 标头将所有段保存在一个段中。这是否解释了 SYS_BRK 调用失败的原因?

然后程序通过使内存页面读/写/执行等继续。我试图找到说明问题的最小代码示例。

在 kdbg 中,示例确实有效,但从命令行启动时无效,因此会打印消息。

0 投票
2 回答
350 浏览

c - 多个 malloc 调用在内部只调用一次 mmap

当我尝试下面的代码时,我无法清楚地分析 malloc api 内部调用。我不清楚的是系统调用 mmap 只为 2 个或多个 malloc 调用调用一次。如果我分配的字节数也超过 4069在内部仅调用一个 mmap(使用 strace -p processid 标识跟踪)。

strace 输出:

我正在寻找的是,如果 malloc 使用得更多,那么它会调用一个以上的 mmap,因为内存超过了两个 malloc 超过 4096

0 投票
1 回答
105 浏览

assembly - 无法更改堆大小 AMD64

我试图通过更改 brk 将堆大小增加 100,但我不知道为什么我的代码不起作用。
这是尝试执行此操作的代码部分:

程序应该打印类似:
x (print InicialHeap)
x + 100 (print InicialHeap + 100)
x (print InicialHeap)
但它只打印 3 次相同的结果“x”。
我必须做些什么来增加我的堆大小?

0 投票
0 回答
173 浏览

assembly - 在 32 位 nasm 程序集中模仿 sbrk

大家好,在我第二年的计算机科学项目中,我们的任务是在 32 位 nasm 汇编中创建一个垃圾收集器。除了一件事,我设法让一切运行良好。我们假设使用对 brk 的系统调用来模仿 gclib sbrk 函数。

这是我的工作版本:

现在为了摆脱 sbrk 我做了以下导致完全不同的函数中的段错误:

这是 abrk 函数:

我不知道哪里出了问题,我问过我的讲师,他也找不到错误。

另外,在我的大学实验室电脑上不起作用的版本在我的电脑上不起作用,这可能是由于 ubuntu 版本的差异造成的吗?谢谢您的帮助。

0 投票
0 回答
573 浏览

debugging - Strace 检测到对 brk 的调用,但 GDB 不会在断点处停止

我已经尝试调试内存泄漏已经有一段时间了。我的主要问题是无法使用像 Valgrind 之类的适当工具,所以我选择了普通的 GDB + strace。

我的程序是一个循环。在每次迭代中,它都会创建一些对象,然后调用它们的析构函数。正如这里所解释,在循环的第一次迭代的第一次分配之后,程序不应该要求更多的内存,因为它总是分配相同的对象,因此应该总是重用相同的空间。然而,我的程序brk()每 15 次迭代调用一次,并且传递给的参数brk每次增加 4.096(例如,第 1 次:brk(0xb7887000) = 0xb7887000、第 2 次:brk(0xb7888000) = 0xb7888000、第 3 次:brk(0xb7889000) = 0xb7889000,等等)。

然后我尝试将 GDB 连接到我的程序,让程序运行几次迭代,并在 brk 上设置一个断点(gdb) break brk

它说它在地址上设置了一个断点,但即使我让我的程序运行超过 15 次迭代,断点也永远不会“调用”(?)。

为什么会这样?我怎么能理解发生了什么?

0 投票
1 回答
3572 浏览

c - sbrk() 是如何工作的?

我试图了解它是如何sbrk工作的。

这是我的小代码:

这输出:

为什么前 2 个地址之间的差异是 0xac7000 - 0xaa6000 = 21000 而不是 10?

0 投票
1 回答
655 浏览

c - 将 sbrk 拆分为 2

为了重新编码 malloc 函数,我做了一个sbrk(stack)where :

我 malloc 总是比我需要的要多,然后我想取一些分配的大小区域size并返回它,如果我想在我已经分配内存之后再做一次 malloc,所以我不必多次调用 sbrk。我怎么能做到这一点,我试图回去brk(start_of_the_allocated_space)sbrk(size)有我需要的空间的开始和结束,但它有段错误。

编辑:

这是我的结构。然后我有一个创建块的函数