小编Vel*_*ven的帖子

为什么我不能在调试/反汇编期间进入调用指令?

反汇编看起来像:

                methShort( ref x, ref y );
000007FF00163F67  lea         r8,[rsp+34h]  
000007FF00163F6C  lea         rdx,[rsp+30h]  
000007FF00163F71  mov         rcx,qword ptr [rsp+20h]  
000007FF00163F76  mov         rcx,qword ptr [rcx+8]  
000007FF00163F7A  mov         rax,qword ptr [rsp+20h]  
000007FF00163F7F  call        qword ptr [rax+18h]  
Run Code Online (Sandbox Code Playgroud)

方法"methShort"是使用Reflection.Emit在.NET中动态创建的.它将两个Int32参数作为"byRef"值.这被调试为"发布模式"构建.

我可以直接通过装配到"调用"指令.R8和RDX指向的内存(参数)看起来很好.我不知道什么样的魔法允许JIT使用寄存器来代替堆栈,但这不是重点.

当我尝试"单步执行"调用指令时,调试器会"跳过"它.该例程确实被称为 - 该方法正确执行其功能.但我似乎无法拆解或进入该方法.

在呼叫之前,RAX包含值00000000025C67A8h.当向其添加18h时,间接地址变为00000000025C67C0h.此地址的QWORD是000000001b64dc48h.

如果我尝试反汇编该地址(000000001b64dc48h),调试器将返回"无法显示指定的地址.所提供的位置没有代码".

作为Hail Mary的尝试,我尝试在没有间接的情况下在RAX上拆解代码,但正如我所料,这也失败了.

任何人都可以告诉我如何获取地址上的任何代码,或者在解码代码之前是否需要在地址(RAX + 18h)上执行类似于LEA的操作?

.net cil x86-64 reflection.emit disassembly

8
推荐指数
1
解决办法
477
查看次数

接口实现理念

在C#中,不允许实现这样的接口:

public interface ITest
{
    IEnumerable<int> Numbers { get; set; }
}

public class CTest : ITest
{
    public List<int> Numbers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:是否有一些软件哲学使这种类型的实现错误?它是一种有争议的范式,有点像多重继承,其中争论已经发生了几十年?

我看不出为什么这样的接口实现不能正常工作的任何原因.如果你知道ITest,那么你只能看到它的IEnumerable<int>一部分CTest.Numbers.如果您了解CTest,那么您可以使用整个List<int>实现.既然List<int>源自IEnumerable<int>,为什么它不满足接口要求?

c# interface

2
推荐指数
1
解决办法
73
查看次数

gRPC - 截止日期与更改系统时间

我的软件运行在一个由外部服务器任意设置其系统时钟的系统上。没有关于 (a) 发生多少时间变化的规则或保证;(b) 这个时间变化发生的频率。

我的第一个问题:在这种情况下,是否有处理截止日期的最佳实践,因为截止日期(截至目前)是绝对时间而不是持续时间?

我的第二个问题:如果我的软件既不关心交付确认也不关心 rpc 调用的返回值,我是否可以安全地将截止日期设置为“现在”甚至过去的时间,以便尽快返回 rpc 调用尽可能?即如果截止日期已经过去,是否保证发送 rpc 的传出有效载荷?

这并不重要,但我在不同的应用程序中同时使用了 gRPC 的 .NET 和 C++ 实现。

grpc

0
推荐指数
1
解决办法
448
查看次数

标签 统计

.net ×1

c# ×1

cil ×1

disassembly ×1

grpc ×1

interface ×1

reflection.emit ×1

x86-64 ×1