- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一些实验,在它运行时编辑进程内存,我注意到当我在 gdb 进程中调用 calloc
时,调用似乎工作并返回原始传递的指针,但内存似乎没有初始化为 0
:
(gdb) call calloc(1, 32)
$88 = (void *) 0x8d9d50
(gdb) x/8xw 0x8d9d50
0x8d9d50: 0xf74a87d8 0x00007fff 0xf74a87d8 0x00007fff
0x8d9d60: 0xfbfbfbfb 0xfbfbfbfb 0x00000000 0x9b510000
但是,如果我在结果指针上调用 memset
,则初始化工作正常:
(gdb) call memset(0x8d9d50, 0, 32)
$89 = 9280848
(gdb) x/8xw 0x8d9d50
0x8d9d50: 0x00000000 0x00000000 0x00000000 0x00000000
0x8d9d60: 0x00000000 0x00000000 0x00000000 0x00000000
最佳答案
有趣的问题。答案是:在 Linux 上(我假设你运行了你的程序):
(gdb) call calloc(1, 32)
不从 libc.so.6
调用 calloc
。
而是从 ld-linux.so.2
调用 calloc
。并且 that calloc
非常少。它预计只能从 ld-linux.so.2
本身调用,并且假定它可以访问的任何页面都是“干净的”和 do not require memset
。 (也就是说,我无法使用 glibc-2.19 重现不干净的 calloc
)。
您可以这样确认:
#include <stdlib.h>
int main()
{
void *p = calloc(1, 10);
return p == 0;
}
gcc -g foo.c -m32 && gdb -q ./a.out
Reading symbols from ./a.out...done.
(gdb) start
Temporary breakpoint 1 at 0x8048426: file foo.c, line 4.
Starting program: /tmp/a.out
Temporary breakpoint 1, main () at foo.c:4
warning: Source file is more recent than executable.
4 void *p = calloc(1, 10);
(gdb) b __libc_calloc
Breakpoint 2 at 0xf7e845a0
(gdb) n
Breakpoint 2, 0xf7e845a0 in calloc () from /lib32/libc.so.6
(gdb) fin
Run till exit from #0 0xf7e845a0 in calloc () from /lib32/libc.so.6
0x0804843a in main () at foo.c:4
4 void *p = calloc(1, 10);
注意程序对 calloc
的调用如何到达断点 #2。
(gdb) n
5 return p == 0;
(gdb) call calloc(1,32)
$1 = 134524952
请注意,来自 GDB 的上述调用没有遇到断点 #2。
让我们再试一次:
(gdb) info func calloc
All functions matching regular expression "calloc":
Non-debugging symbols:
0x08048310 calloc@plt
0xf7fdc820 calloc@plt
0xf7ff16a0 calloc
0xf7e25450 calloc@plt
0xf7e845a0 __libc_calloc
0xf7e845a0 calloc
(gdb) info sym 0xf7ff16a0
calloc in section .text of /lib/ld-linux.so.2 ## this is the wrong one!
(gdb) break *0xf7ff16a0
Breakpoint 3, 0xf7ff16a0 in calloc () from /lib/ld-linux.so.2
(gdb) disable
(gdb) start
Temporary breakpoint 7 at 0x8048426: file foo.c, line 4.
Starting program: /tmp/a.out
Temporary breakpoint 7, main () at foo.c:4
4 void *p = calloc(1, 10);
(gdb) ena 3
(gdb) n
5 return p == 0;
请注意,断点#3 没有在上面触发(因为调用了“真正的”__libc_calloc
)。
(gdb) call calloc(1,32)
Breakpoint 3, 0xf7ff16a0 in calloc () from /lib/ld-linux.so.2
The program being debugged stopped while in a function called from GDB.
Evaluation of the expression containing the function
(calloc) will be abandoned.
When the function is done executing, GDB will silently stop.
(gdb) bt
#0 0xf7ff16a0 in calloc () from /lib/ld-linux.so.2
#1 <function called from gdb>
#2 main () at foo.c:5
QED。
更新:
I don't see the ld-linux version in the output of "info func calloc"
我认为您在 info func
中看到的内容取决于您是否安装了调试符号。对于(64 位)glibc with 调试符号,这是我看到的:
(gdb) info func calloc
All functions matching regular expression "calloc":
File dl-minimal.c:
void *calloc(size_t, size_t); <<< this is the wrong one!
File malloc.c:
void *__libc_calloc(size_t, size_t); <<< this is the one you want!
Non-debugging symbols:
0x0000000000400440 calloc@plt
0x00007ffff7ddaab0 calloc@plt
0x00007ffff7a344e0 calloc@plt
这里有另一种方法来确定 calloc
GDB 认为它应该调用什么:
(gdb) start
Temporary breakpoint 1 at 0x8048426: file foo.c, line 4.
Starting program: /tmp/a.out
Temporary breakpoint 1, main () at foo.c:4
warning: Source file is more recent than executable.
4 void *p = calloc(1, 10);
(gdb) p &calloc
$1 = (<text variable, no debug info> *) 0xf7ff16a0 <calloc>
(gdb) info sym 0xf7ff16a0
calloc in section .text of /lib/ld-linux.so.2
或者,为了完整起见,使用带有调试符号的 64 位 glibc:
(gdb) start
Temporary breakpoint 1 at 0x400555: file foo.c, line 4.
Starting program: /tmp/a.out
Temporary breakpoint 1, main () at foo.c:4
4 void *p = calloc(1, 10);
(gdb) p &calloc
$1 = (void *(*)(size_t, size_t)) 0x7ffff7df1bc0 <calloc>
(gdb) info sym 0x7ffff7df1bc0
calloc in section .text of /lib64/ld-linux-x86-64.so.2
关于c - 为什么在 gdb 中调用 calloc 似乎不会将内存归零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39760479/
我有一个使用 PHP 设置页面输入字段值的表单,例如: // create and fill inputVarsArr with keys that have empty vals $troubleI
大家好,我是码农先森。 古话说的 "三十而立",正是担重之时,却大部分人在职场中都处于不上不下的尴尬境地。已经没有刚毕业时那股子冲劲,被生活和工作磨平了棱角。 在技术思想方面,
我想将这个“.wrapper wf”类归零。 (比如 header 和 .p)但是我不能成功,你能帮我弄清楚吗? here is the fiddle .wf{ -webkit-transfo
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Set all bytes of int to (unsigned char)0, guaranteed t
当使用STL容器时,我不确定默认分配器分配的一个int是否已经归零。以下代码对问题表示"is": #include #include int main() { using namespace
我有一个包含弱引用的对象的以下简单代码: //界面 @interface GMWeakRefObj : NSObject @property (weak) id object; @end //执行 @
我是 React/redux 的新手。我有一个用于身份验证的 Redux 操作,之后我需要重定向到一个确认页面主页。我不知道如何重定向 这是我的 index.js import React, { Pr
我有一个 vector我想把它归零。我需要尺寸保持不变。 通常的方法是遍历所有元素并重置它们。但是,vector是 specially optimized容器,根据实现,每个元素可能只存储一位。有没有
我错误地将密码存储为 Java 程序中的字符串。我想防止此字符串密码出现在堆转储/内存转储中。理想情况下,我应该使用 char[] 并在使用后将其填充为零(如本文 - https://nvisium.
是否 x.resize(1024)保证valarray x会归零吗? 是否std::valarray z(1024);保证它也将被填充为零? 对于 Mac、Windows 和 Linux 是这样吗?即
下面的 java 代码是否足以清除内存中的 key (将其所有字节值设置为 0)? zerorize(SecretKey key) { byte[] rawKey = key.getEncod
我是 React 和 Redux 的初学者,我正在尝试设置一个非常简单的登录表单和重定向。我稍后会添加 react-router 或 react-router-redux。 我真的不明白我必须在哪里放
最近我一直在使用 cgo 在我的一个项目中设置 libsodium,以便使用 crypto_pwhash_str 和 crypto_pwhash_str_verify 函数. 这一切都进行得非常顺利,
我正在使用以下代码从网站检索一些数据。 Public Function giveMeValue(ByVal link As String) As String Set htm = CreateO
我想要获得与在 Photoshop 中关闭其中一个 channel 相同的结果。我正打算尝试循环改变颜色的每个像素。有更好的方法吗? 最佳答案 使用 Core Image 的颜色矩阵滤镜。 The a
我有以下用于导航的组件: import React, { Component } from "react"; import { connect } from 'react-redux'; import
试图在 Redux-React-API 丛林的黑暗深处找到方向 - 设法从 API 和 console.log 中获取数据 - 但我和我的 Google 技能都无法找出它不呈现的原因。 react 组
在我使用 redux 的 native react 应用程序中,reducers 似乎工作正常,但 UI 不会根据状态修改进行更新。 这是我的 reducer : const initialState
这tutorial Dan Abramov 提出,使用作用于全局状态(而不是一部分状态)的选择器的优势在于它们允许容器与状态结构的知识分离。 如果是这样的话,我们不应该也避免直接将状态值映射到 Pro
背景 我正在构建一个包装程序包,它组合了定义的命令并允许它们在 cli 或交互式 shell 上下文中执行。命令在类似这样的结构中定义(显示相关字段): type Handler func(c *Co
我是一名优秀的程序员,十分优秀!