首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用MSVC让malloc每次都返回相同的地址?

如何使用MSVC让malloc每次都返回相同的地址?
EN

Stack Overflow用户
提问于 2020-05-11 21:51:24
回答 3查看 382关注 0票数 2

出于调试目的,我希望malloc在每次执行程序时都返回相同的地址,但在MSVC中情况并非如此。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdlib.h>
#include <stdio.h>

int main() {
    int test = 5;
    printf("Stack: %p\n", &test);
    printf("Heap: %p\n", malloc(4));
    return 0;
}

用cygwin的gcc编译,每次都得到相同的堆栈地址和堆地址,而用MSVC编译时关闭了ASLR...

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cl t.c /link /DYNAMICBASE:NO /NXCOMPAT:NO

...I每次都会获得相同的堆栈地址,但是堆地址会发生变化。

我已经尝试添加注册表值HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages,但它不起作用。

EN

回答 3

Stack Overflow用户

发布于 2020-05-12 06:45:24

malloc()每次返回的堆栈地址和指针都可能不同。事实上,当程序在Mac/OS上多次编译和运行时,两者是不同的。

编译器和/或OS可能会导致此行为尝试并使其更难利用软件缺陷。在某些情况下,可能有一种方法可以防止这种情况,但如果您的目标是重放同一系列malloc()地址,其他因素可能会更改地址,例如时间敏感行为、文件系统副作用,更不用说不确定的线程行为。您应该尝试并避免在测试中依赖于此。

还要注意,&test应该转换为(void *),因为%p需要一个void指针,但不能保证它具有与int *相同的表示形式。

票数 2
EN

Stack Overflow用户

发布于 2020-05-12 07:45:58

事实证明,您可能无法从MSVC运行时库中获得确定性行为。C/C++运行时库的调试版本和生产版本最终都调用了一个名为_malloc_base()的函数,该函数又调用了Win32 API函数HeapAlloc()。不幸的是,无论是HeapAlloc()还是提供其堆的函数HeapCreate()都没有记录标志或其他方式来获得确定性行为。

您可以按照@Enosh_Cohen的建议,在VirtualAlloc()之上构建自己的分配方案,但是这样就会失去MSVC分配函数提供的debug functionality

票数 2
EN

Stack Overflow用户

发布于 2021-04-03 14:40:38

Diomidis' answer建议在VirtualAlloc之上创建一个新的malloc,所以我就这么做了。事实证明这有些挑战,因为VirtualAlloc本身不是确定性的,所以我记录了我使用的过程。

首先,获取Doug Lea's malloc。(指向源代码的ftp链接已断开;请使用this http alternative。)

然后,将win32mmap函数替换为以下代码(因此将其放入公共领域,就像Doug Lea的malloc本身一样):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static void* win32mmap(size_t size) {
  /* Where to ask for the next address from VirtualAlloc. */
  static char *next_address = (char*)(0x1000000);

  /* Return value from VirtualAlloc. */
  void *ptr = 0;

  /* Number of calls to VirtualAlloc we have made. */
  int tries = 0;

  while (!ptr && tries < 100) {
    ptr = VirtualAlloc(next_address, size,
                       MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
    if (!ptr) {
      /* Perhaps the requested address is already in use.  Try again
       * after moving the pointer. */
      next_address += 0x1000000;
      tries++;
    }
    else {
      /* Advance the request boundary. */
      next_address += size;
    }
  }

  /* Either we got a non-NULL result, or we exceeded the retry limit
   * and are going to return MFAIL. */
  return (ptr != 0)? ptr: MFAIL;
}

现在编译并将生成的malloc.c与您的程序链接,从而覆盖MSVCRT分配器。

这样,我现在可以获得一致的malloc地址。

但是要当心

  • 我使用的确切地址0x1000000是通过使用VirtualQuery枚举我的地址空间来查找大的、持续可用的空洞来选择的。地址空间布局似乎具有一些不可避免的不确定性,即使禁用了ASLR也是如此。您可能需要调整该值。

  • 我证实,在我的特殊情况下,在100次连续运行中获得相同的地址是可行的。对于我想做的调试来说,这已经足够好了,但是在足够多的迭代之后,或者在重启之后,这些值可能会发生变化。

  • 此修改不应用于生产代码,仅用于调试。重试限制是一个错误,我没有做任何事情来跟踪堆何时缩小。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61740028

复制
相关文章
究极缝合怪 | Pulsar核心概念和特性解读
Pulsar 是一个用于服务器到服务器的消息系统,具有多租户、高性能等优势。Pulsar 最初由 Yahoo 开发,目前由 Apache 软件基金会管理。
王知无-import_bigdata
2022/03/11
2K0
究极缝合怪 | Pulsar核心概念和特性解读
Apache Pulsar 技术系列 - Pulsar 总览
导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案,数据持久化依赖 Apache BookKeeper 实现,支持多租户、低延时、读写分离、跨地域复制、快速扩容、灵活容错等特性。本文将从以下几个方面为大家介绍 Apache Pulsar的设计原理和特性。 1、Apache Pulsar 架构 2、架构设计的优势 3、Pulsar 特性 4、总结 Apache Pulsar 架构 存储计算分离 Apache Pulsar 是 Pub/Sub 模型的消息系统,并且从设计上做了存储和
腾讯云中间件团队
2023/03/24
1.4K1
Apache Pulsar 技术系列 - Pulsar 总览
消息传输的设计方式(上)
企鹅号小编
2018/01/09
9550
消息传输的设计方式(上)
Apache Pulsar简介
"Pulsar is a distributed pub-sub messaging platform with a very flexible messaging model and an intuitive client API."
林一
2018/07/24
2.1K0
Apache Pulsar简介
两个优秀的分布式消息流平台:Kafka与Pulsar
👆点击“博文视点Broadview”,获取更多书讯 本文向读者介绍两个优秀的分布式消息流平台:Kafka与Pulsar。 Apache Kafka(简称Kafka)是由LinkedIn公司开发的分布式消息流平台,于2011年开源。Kafka是使用Scala和Java编写的,当下已成为最流行的分布式消息流平台之一。Kafka基于发布/订阅模式,具有高吞吐、可持久化、可水平扩展、支持流数据处理等特性。 Apache Pulsar(简称Pulsar)是雅虎开发的“下一代云原生分布式消息流平台”,于2016年开源
博文视点Broadview
2022/09/15
6930
两个优秀的分布式消息流平台:Kafka与Pulsar
两个优秀的分布式消息流平台:Kafka与Pulsar
本文向读者介绍两个优秀的分布式消息流平台:Kafka与Pulsar。 Apache Kafka(简称Kafka)是由LinkedIn公司开发的分布式消息流平台,于2011年开源。Kafka是使用Scala和Java编写的,当下已成为最流行的分布式消息流平台之一。Kafka基于发布/订阅模式,具有高吞吐、可持久化、可水平扩展、支持流数据处理等特性。 Apache Pulsar(简称Pulsar)是雅虎开发的“下一代云原生分布式消息流平台”,于2016年开源,目前也在快速发展中。Pulsar集消息、存储、轻量化
程序猿DD
2022/09/13
6460
两个优秀的分布式消息流平台:Kafka与Pulsar
大伙评评理,Kafka与Pulsar 谁更牛?
本文向读者介绍两个优秀的分布式消息流平台:Kafka与Pulsar。 Apache Kafka(简称Kafka)是由LinkedIn公司开发的分布式消息流平台,于2011年开源。Kafka是使用Scala和Java编写的,当下已成为最流行的分布式消息流平台之一。Kafka基于发布/订阅模式,具有高吞吐、可持久化、可水平扩展、支持流数据处理等特性。 Apache Pulsar(简称Pulsar)是雅虎开发的“下一代云原生分布式消息流平台”,于2016年开源,目前也在快速发展中。Pulsar集消息、存储、轻量化
江南一点雨
2022/09/20
7730
大伙评评理,Kafka与Pulsar 谁更牛?
Apache Pulsar事务机制原理解析|Apache Pulsar 技术系列
导读 Apache Pulsar 在 2.8.0 正式支持了事务相关的功能,Pulsar 这里提供的事务区别于 RocketMQ 中 2PC 那种事务的实现方式,没有本地事务回查的机制,更类似于 Kafka 的事务实现机制。Apache Pulsar 中的事务主要用来保证类似 Pulsar Functions 这种流计算场景中 Exactly Once 语义的实现,这也符合 Apache Pulsar 本身 Event Streaming 的定位,即保证端到端(End-to-End)的事务实现的语
腾讯云中间件团队
2021/07/02
2K0
pulsar总览
pulsar 是 Apache 的顶级项目, 定位为下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性,被看作是云原生时代实时消息流传输、存储和计算最佳解决方案。Pulsar 是一个 pub-sub (发布-订阅)模型的消息队列系统。
leobhao
2023/03/08
1.2K0
pulsar总览
Kafka 已落伍,转角遇见 Pulsar!
自 LinkedIn 2011 年创建了 Apache Kafka 后,这款消息系统一度成为大规模消息系统的唯一选择。为什么呢?因为这些消息系统每天需要传递数百万条消息,消息规模确实很庞大(2018 年 Twitter 推文平均每天 500 万条,用户数平均每天为 1 亿)。那时,我们没有 MOM 系统来处理基于大量订阅的流数据能力。所以,很多大牌公司,像 LinkedIn、Yahoo、Twitter、Netflix 和 Uber,只能选择 Kafka。
王知无-import_bigdata
2019/08/06
1.3K0
Pulsar 介绍与部署
Apache Pulsar 是灵活的发布-订阅消息系统(Flexible Pub/Sub messaging),采用计算与存储分离的架构。雅虎在 2013 年开始开发 Pulsar ,于 2016 年首次开源,目前是 Apache 软件基金会的顶级项目。Pulsar 具有支持多租户、持久化存储、多机房跨区域数据复制、高吞吐、低延迟等特性。
Se7en258
2021/07/01
3.2K0
Apache Pulsar 技术系列 - Pulsar事务实现原理
导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案,支持多租户、低延时、读写分离、跨地域复制、快速扩容、灵活容错等特性。腾讯云MQ Oteam Pulsar工作组对 Pulsar 做了深入调研以及大量的性能和稳定性方面优化,目前已经在TDBank、腾讯云TDMQ落地上线。本篇将简单介绍Pulsar服务端消息确认的一些概念和原理,欢迎大家阅读。 作者简介  林琳                                                           
腾讯云中间件团队
2022/03/03
2K0
5000字阐述云原生消息中间件Apache Pulsar的核心特性和设计概览
Apache Pulsar 是 Apache 软件基金会顶级项目,自称是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性。
王知无-import_bigdata
2021/07/30
1K0
都 2023 年了,你还在用 Kafka?快试试这个全新平台吧
最近这个 Apache Pulsar 消息中间件非常的火,号称云原生时代最能打的消息中件,今天,就一起来看看它到底有多牛逼?
架构狂人
2023/08/16
2850
都 2023 年了,你还在用 Kafka?快试试这个全新平台吧
消息队列基本原理和选型对比
作者:anncdchen,腾讯 PCG 后台开发工程师 消息队列使用场景 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,削峰填谷等问题。实现高性能、高可用、可伸缩和最终一致性架构。 解耦:多个服务监听、处理同一条消息,避免多次 rpc 调用。 异步消息:消息发布者不用等待消息处理的的结果。 削峰填谷:较大流量、写入场景,为下游 I/O 服务抗流量。当然大流量下就需要使用其他方案了。 消息驱动框架:在事件总线中,服务通过监听事件消息驱动服务完成相应动作。 消息队列模式 点对点模
腾讯技术工程官方号
2022/08/26
1.1K0
消息队列基本原理和选型对比
Kafka、RabbitMQ、Pulsar、RocketMQ基本原理和选型
消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,削峰填谷等问题。实现高性能、高可用、可伸缩和最终一致性架构。
黄豆酱
2023/01/01
1.9K0
Apache Pulsar崛起 | Meetup北京站全解析
场景描述:2019 年 7 月,Apache Pulsar 正式发布了 2.4.0 版本,在 2.3.2 版本的基础上新增了诸多功能并修复了大量漏洞,包括存储端、Broker 端、Schema、安全、客户端、Pulsar Functions、Pulsar IO、Pulsar Kafka、Pulsar Flink 和 Pulsar Storm 等多方面。
大数据真好玩
2019/10/23
8720
Apache Pulsar崛起 |  Meetup北京站全解析
Pulsar 也会重复消费?
当他告诉我这个现象的时候我就持怀疑态度,根据之前使用的经验 Pulsar 在官方文档以及 API 中都解释过:
crossoverJie
2022/10/27
8080
Pulsar 也会重复消费?
Pulsar中间件入门学习
Pulsar 是一个用于服务器到服务器的消息系统,具有多租户、高性能等优势。最初是由 Yahoo 开发,目前由 Apache 软件基金会 管理。是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性,被看作是云原生时代实时消息流传输、存储和计算最佳解决方案。
java技术爱好者
2022/04/18
6910
Pulsar中间件入门学习
关于Pulsar与Kafka的一些比较和思考
作者:Sijie Guo 来源:https://streaml.io/blog/pulsar-streaming-queuing
王知无-import_bigdata
2019/09/29
2.9K0
关于Pulsar与Kafka的一些比较和思考

相似问题

在Apache Pulsar中授予命名空间权限

11

Apache Pulsar中的主题复制

12

Apache Flink和Apache Pulsar

10

读取Apache Pulsar上的分区主题

12

Pod不会安装到Pulsar命名空间

237
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文