问题标签 [rebasing]

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 投票
2 回答
2965 浏览

.net - .NET assemblies and DLL rebasing

According to this article rebasing is not necessary for .NET assemblies due to JIT compilation of the code. The article states:

"JIT-compiled code does not have a rebasing problem since the addresses are generated at run time based on where the code is placed in memory. Also, MSIL is rarely affected by base address misses since MSIL references are token-based, rather than address-based. Thus when the JIT compiler is used, the system is resilient to base address collisions."

However, I have noticed that VS2008 assigns the default 0x0400000 base address to all assemblies (project properties > build > advanced) and if I do a listdlls /r for my process all my .NET assemblies are in fact rebased per default.

If I assign addresses myself, no rebasing is done.

My question is: What is rebased in this case and why?

EDIT: I should add that I am not talking about NGen'ed assemblies.

0 投票
1 回答
671 浏览

visual-studio-2005 - Visual Studio 2005 中的函数指针不正确,代码从 1 字节偏移开始

有问题的代码挂接到 explorer.exe,但在进入回调函数时崩溃:

调用栈:

Visual Studio 2005 给出了以下反汇编:

而0x548B0CC4周围的内存都是?????? 所以它不是映射内存,因此崩溃。

myCallWndProcRetCallback 开头的机器代码是这样的:

但 Visual Studio 有时也会为此函数提供以下反汇编:

这看起来像是正确的反汇编,但它比上面的反汇编晚 1 个字节!您可以看到从 0x60055B58 开始的指令是相同的。

因此,看起来链接器说函数位于 0x60055B50,但代码实际上从 0x60055B51 开始。我已经确认前者是设置到 Windows 挂钩中的回调。因此,当 Windows 回调函数时,它会执行错误的代码。

我的问题是链接器怎么会出错?我进行了重建,问题消失了,这似乎是随机的。当时 /FORCE:MULTIPLE 链接器选项有效,但如果没有它,则不会报告此回调的链接错误。

后期添加:这可能与 DLL 的重定位或变基有关吗?如果重定位偏移了 1 个字节,这可能会导致问题吗?

0 投票
1 回答
1804 浏览

.net - 如果我想 rebase 我的 DLL,我该怎么做呢?

这是这个问题的延续。

我正在测试是否对 .NET DLL 进行变基,NGENning 它们是否会在终端服务器的内存中为我提供更多共享代码。

但是,我的计划似乎有一个缺陷,我似乎无法找到一种工作方法来找出一组工作地址。

我认为我可以做的如下:

  1. 只需构建和 NGEN 一切
  2. 启动程序,确保所有 DLL 都已加载
  3. 使用LISTDLLS /R PROGRAMNAME 获取正在运行的实例的当前使用地址列表
  4. 使用重新映射的那些 DLL 的地址作为这些 dll 的新基地址
  5. UN-NGEN 一切,从 1 开始

然而,这已经变成了薛定谔的练习,因为重新定位某些 DLL 的行为显然会改变加载顺序或操作系统重新定位其他 DLL 的方式。

例如,假设在初始运行后,我有一个列表,说明 DLL A、B 和 C 需要位于地址 1000、2000 和 3000。没有提及 DLL D、E 和 F,它们也是同一个系统。大概这些是在它们当前的基地址加载的,否则我会假设 LISTDLLS 会告诉我这一点。

所以我改变了A、B、C的地址,重复一切,现在DLL C、D和E已经被重新定位。A和B现在都好了,E和F现在搬家了,C还在被洗牌。

我意识到这个练习有点徒劳,因为不管我在我的机器上发现了什么,在目标终端服务器上使用和注入的 DLL 可能会干扰这张图片,但我认为如果我至少可以确保一些DLL 可以位于其规定的基地址,然后同一程序的多个实例之间的共享代码量会增加。只是说,只是为了没有必要“提醒”我:)

由于我们所有 DLL 的原始基地址是默认值,这意味着每个 DLL(可能除了第一个加载的)都被重新定位,因此映射到页面文件,我认为可能会有高于 0 的增益。

有什么建议吗?

0 投票
2 回答
391 浏览

asp.net - 如何在 ASP.NET 页面中对超链接和内容进行变基?

我有一个 ASP.NET 页面来处理“404 页面未找到”,它是通过在我的 web.config 文件中配置<customErrors>部分并在 IIS 管理器中设置 404 错误的自定义错误页面来设置的。

它对我网站根目录中的页面按预期工作,但在站点的子目录中不起作用 - 我的自定义错误页面中的超链接和内容具有错误的 url 基础。

我的错误页面中的所有链接都是服务器端控件(runat="server"),并且它们的链接基于“~/”。

当我浏览http://mysite/nosuchfolder/nosuchfile带有链接的页面时,页面呈现的链接认为它是从根目录提供的,而不是从根目录提供服务,nosuchfolder因此所有链接在浏览器中都被破坏,因为浏览器基于nosuchfolder.

有什么方法可以“告诉” ASP.NET 页面以不同的文件夹/文件名重新建立链接?

笔记:

  • 大部分页面模板是从母版页呈现的
  • 我正在运行 IIS6 并将自定义错误 404 设置为 URL:/error404.aspx
  • 在我的 web.config 文件中,我已将<customErrors>部分配置为重定向到/error404.aspx
  • 作为一种解决方法,我<base>在页面中使用 HTML 标记,但我想避免这种情况
  • 我不想将所有基于“~/”的链接更改为“/”或内联基础黑客
0 投票
4 回答
2463 浏览

asp.net - 主题图像 URL 变基 asp.net

我正在实施主题以使现有网站能够根据请求的 URL 重新命名(徽标、颜色、图像等)。我了解如何做到这一点,并且皮肤工作正常,除了一些与图像 URL 相关的例外情况。

具体来说,我有一个控制属性,它是不可行的皮肤。在实现主题之前,它看起来像这样:

显然,这不适用于主题。因此,经过反复试验和阅读,我试图像这样实现它:

然而,这是行不通的。生成的 html 如下所示:

任何正确方向的指针将不胜感激。

大卫

0 投票
1 回答
933 浏览

.net - .NET 程序集缓存/ngen/jit 图像预热和冷却行为

我有一个通过 C++/CLI 使用 C#.NET 2.0 DLL 构建的输入法 (IME) 程序。由于 IME 总是附加到另一个应用程序,因此 C#.NET DLL 似乎无法避免图像地址变基。

尽管我已应用 ngen 创建该 C#.NET 2.0 DLL 的本机映像并将其安装到全局程序集缓存中,但它并没有太大改善,大约 12 秒。低至 9 秒。在缓慢的 PIII 级 PC 上。

因此,我使用了一个小型应用程序,它在启动时加载 C#.NET DLL 引用的所有组件,以“预热”该 DLL 的本机映像。它可以将加载时间加快到 0.5 秒。

然而,它只工作了一段时间。约30分钟。后来,它似乎又“降温”了。

有什么方法可以控制 GAC 或本机图像的行为始终“热”?这完全是图像地址变基问题吗?

0 投票
2 回答
490 浏览

.net - 如何衡量在 NGen 之前正确地重新设置 .NET 程序集的效果?

我们的应用程序有很多 .NET 程序集,到目前为止,还没有使用 NGen 脚本部署这些程序集,因此它们总是在运行时进行 JIT 处理。

由于我们的应用程序通常部署到终端服务器,让 Windows 共享代码的二进制图像可能比当前的方式更优化,所以我正在研究设置基地址和 NGen'ning 程序集。

所以我在没有任何 NGen 的情况下运行该程序,并使用 [来自 SysInternals 的 listdlls][1] 来查找每个的大小,然后我将其增加到下一类大小(即 xxxx --> 10000)。然后我为我们所有的程序集列出了一个内存列表,并调整了它们的基地址。

到目前为止一切顺利,listdlls我现在可以看到我们的程序集都没有在运行时重新设置基础。

但是,如何测量两个实例之间实际共享的内存量?基本上,假设我在未对程序集执行 NGEN 的情况下启动程序的两个实例,然后在执行 NGEN 后再次执行。

我应该查看什么样的数字,从哪个工具中找到实际效果(如果有的话)?

例如,我知道重新定位我们的程序集的行为可能会移动我们使用的第 3 方程序集(例如 DevExpress 组件),因此它们突然必须重新定位,然后整个事情就是洗牌。

那么,我从哪里读取哪些数字?比如,我是否使用任务管理器的工作集?私人记忆?提交大小?之前和之后的空闲内存?

有什么建议吗?

0 投票
3 回答
674 浏览

c# - 在 .net4 中重新定位 Dll 的尝试似乎不起作用

我正在尝试基于运行在 .net4 上的小型测试解决方案重新构建 Dll,该解决方案由一个小型 .exe 和三个小型 .Dll 组成。程序集引用已正确设置,程序可以正常编译和运行。

这个练习的目的是检查变基是如何工作的,以便我可以将它与 ngen 联系起来,并在我正在从事的大型项目中提高性能。

我尝试了许多不同的方法来重新定位 Dll,并使用 vmmap、Visual Studio 模块调试器窗口和进程资源管理器监控结果;到目前为止还没有成功:

  1. 我已将Dll1.dll、Dll2.dll 和 Dll3.dll 的 Build- >Advanced->DLL Base Address设置分别设置为 0x41000000、0x42000000 和 0x43000000。这些地址肯定被保存为每个 Dll 中的首选基地址,但对于每次运行,Dll 都会不规则地将其图像重新定位到内存中的许多不同位置。

  2. 我试过使用这个应用程序。它生成的日志显示 Dll 确实具有内置的首选基地址(由我选择),但是在运行时结果仍然不稳定

  3. 我试过使用ngen。这导致 .ni 版本的 Dll 与原始 Dll 一起加载,并且所有 6 个版本的内存位置都与我要求的位置相去甚远。

  4. 我已经尝试将我的图像粘贴在 GAC 中。令人振奋的是,只有 GAC 版本的 Dll 被加载,但它们的内存位置仍然不稳定。

  5. 我已经尝试过上述每种组合的感觉。没有成功。

在运行时使用 VMMap 进行检查表明,在 0x10000000 和 0x50000000 之间的地址空间中存在巨大的可用内存差距,因此应该没有冲突,也不需要发生 Dll 变基。Dll 也非常小,我在它们之间留下的 0x01000000 间隙非常大,所以它们不应该相互碰撞。

我错过了什么?

在此练习中,我的主要参考资料是这篇文章,该文章信息量很大,但它是在 2006 年为 .Net2 编写的:从那时到现在,有什么根本性的变化吗?

我严重怀疑它是否有很大的不同,但这是我正在使用的代码以防万一:

程序.cs:

Class1.cs:

Class2.cs:

Class3.cs:

0 投票
2 回答
2035 浏览

c# - dll基址

我有一个带有一个 exe 和三个 Dll 的小型测试解决方案,该 exe 分别调用三个 Dll 一次。我已将Dll1.dll、Dll2.dll 和 Dll3.dll 的 Build- >Advanced->DLL Base Address设置分别设置为 0x41000000、0x42000000 和 0x43000000。我跑了

这已经成功地将应用程序与三个 Dll 一起生成。我真的不想生成 exe,但到目前为止,这是产生任何结果的唯一方法。

在运行时,我使用 VMMap 监视虚拟地址空间,它显示 ngen 的 Dll 位于一致的虚拟内存范围内,但是它们仍在该范围内跳跃,每次我运行时加载的地址都略有不同他们。VMMap 显示在我尝试加载图像的地址上没有分配任何内容,因此这种跳跃行为不是由地址冲突引起的。

我一直在记录日志:

请注意,地址的前两位数字在所有运行中对于所有三个 Dll 保持一致。

我的实际问题是:这是成功的指标吗?我有点困惑,因为我认为 Dll 将恰好位于 0x41000000、0x42000000 和 0x43000000。结果表明他们在那个区域徘徊,但从未真正坐在我让他们坐的地方。我的理解是,您希望将 Dll 准确地加载到您要求它们加载的地址,这样它们就不必进行昂贵的变基操作(当您的 Dll 被 ngen'd 时,这非常昂贵)但是,这不正是正在发生的事情吗?当然,我的 Dll 在某个区域徘徊,但它们并没有完全坐在我要求它们坐的位置,所以每次运行时肯定会执行昂贵的变基操作吗?这正是我想要避免的。

注意:我对支持/反对 rebase 和 ngen 的论点不感兴趣。我只想知道发生了什么以及如何让它工作。

干杯!

0 投票
2 回答
7634 浏览

git - 对 bitbucket 拉取请求的单个提交的 Squashing 提交

我正在尝试开发一个 git flow 版本,该版本可用于一小群开发人员来管理我们的开发过程,大多数员工都是 git 和 bitbucket 的新手。我对两者都有更多的经验,但我绝不是专家。我们需要对上游开发的拉取请求进行一次提交,到目前为止我制定的流程如下:

假设来自上游的存储库的现有分支。另外,请注意,我知道其中一些命令可以组合使用,但我也在尝试先教授基础知识。这就是它的记录方式(或多或少,我在实际文档中更加冗长)。

做工作

为拉取请求做准备,这个分支被创建,所以我们可以在提交被压扁之前保留我们的提交,以防拉取请求被拒绝,或者出于任何原因。

-> 在这一点上,我遇到了问题。我似乎无法完成一项承诺。这个分支中总是至少有两个提交,我已经看到使用 --root 的选项,但是当我这样做时,bitbucket 抱怨我的拉取请求分支和上游分支不相关,我无法发出拉取请求。

我觉得我非常接近有一个工作流程,所以任何帮助将不胜感激。