小编Mic*_*DDD的帖子

无法将 C# 字符串从用户空间传递到内核模式 C 并使用它来查找特定的 LDR_DATA_TABLE_ENTRY

我在比较从用户模式类型 LPWSTR 传递到 LDR 表条目类型 UNICODE_STRING 的字符串时遇到困难

内核 C:

struct {
    int pid;
    int user_pid;
    int size;
    int protection_mode;
    int allocation_type;
    void* address;
    void* write_buffer;
    LPWSTR module_name;
}
userland_operation;
Run Code Online (Sandbox Code Playgroud)

这个结构体通过 deviceiocontrol 传递给内核。对应的用户空间结构如下:

public struct MemOperation
{
    public int Pid;
    public int UserPid;
    public int Size;
    public int protection_mode;
    public int allocation_type;
    public IntPtr Addr;
    public IntPtr WriteBuffer;
    [MarshalAs(UnmanagedType.LPWStr)] public String ModuleName;
}
Run Code Online (Sandbox Code Playgroud)

字符串在哪里 ModuleName被编组为 LPWStr。

ModuleName是进程中加载​​模块的所需搜索词。现在,事情变得棘手了。我可以通过访问的字符串_LDR_DATA_TABLE_ENTRYUNICODE_STRING. 我想将此 UNICODE_STRING 与我的 LPWSTR 进行比较。

我尝试了以下方法,但没有奏效:

{
    UNICODE_STRING …
Run Code Online (Sandbox Code Playgroud)

c c# deviceiocontrol windows-kernel

10
推荐指数
1
解决办法
119
查看次数

在 Docker 中使用 EF Core 对 SQLite DB 的每个查询都非常慢,除非有对 OpenConnection 的显式调用

我正在本地主机上运行一个简单的 .NET Core 3.1 Web 应用程序。Web 应用程序在 Docker Linux 容器中运行(我的主机操作系统是 Windows 10)。Web 应用程序使用的 SQLite 数据库使用 EF Core 连接,几乎是空的,非常小,只有 60Kb,每个表有 20 条或更少的记录,并且存储在主机上并使用以下命令为容器挂载:

--mount type=bind,source='SomeDummyHostPath',target=/mnt/hostFolder
Run Code Online (Sandbox Code Playgroud)

问题是在 DBContext 上执行的每个查询都运行得很慢(读取 2 行大约需要 2 秒)。当我在 Docker 容器之外运行应用程序时,一切运行顺利(意味着相同的查询在 ~1ms 内执行)。

奇怪的是,dbContext.Database.OpenConnectionAsync()在每次调用 EF 的 DBSets 之前调用之后,Docker 容器中的每个查询都运行得很快(几毫秒)。

为什么在这种情况下性能如此糟糕?没有OpenConnectionAsync在每次查询之前显式调用的情况下,有什么方法可以改进它?

c# entity-framework docker .net-core

6
推荐指数
1
解决办法
349
查看次数

Ada SPARK 将字符串转换为整数

我需要有关 Ada SPARK 的帮助。我想将像“1”这样的字符串保存到整数变量中。背景:我想从命令行输入读取数字并将它们作为整数处理,并使用 SPARK Prove 检查程序。这是一个最小的例子:

with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;

procedure Main is
   pragma SPARK_Mode;
   test_string : Unbounded_String;
   identifier : Integer;
begin

   test_string := To_Unbounded_String("1");
   identifier := Integer'Value(To_String(test_string));
   
end Main;

Run Code Online (Sandbox Code Playgroud)

当我执行 SPARK Prove 时,我收到以下消息:“中:前提条件可能失败”。我已经实现了一个函数来检查 test_string 是否包含 0 - 9 的字符,但它没有解决问题。有谁有解决问题的方法吗?

ada spark-ada

6
推荐指数
1
解决办法
573
查看次数

剑道 UI 条形图中的动态系列

我已经在这个问题上花费了几个小时,但似乎无法弄清楚如何解决它。

我正在尝试创建这样的堆积条形图:

http://demos.kendoui.c​​om/dataviz/bar-charts/stacked-bar.html

我正在使用 ASP.NET MVC (Razor)。

下面是一些示例代码:

@(Html.Kendo().Chart()
    .Name("chart")
    .Title("chart")
    .Legend(legend => legend
        .Position(ChartLegendPosition.Bottom)
    )
    .SeriesDefaults(seriesDefaults =>
        seriesDefaults.Bar().Stack(true)
    )
    .Series(series =>
    {

        series.Bar(new double[] { 4 });
        series.Bar(new double[] { 2 });
        series.Bar(new double[] { 7 });

    })
    .CategoryAxis(axis => axis
        .Categories("Machine")
        .MajorGridLines(lines => lines.Visible(false))
    )
    .ValueAxis(axis => axis
        .Numeric()
        .Labels(labels => labels.Format("{0}"))
        .Max(24)
        .Line(line => line.Visible(false))
        .MajorGridLines(lines => lines.Visible(true))
    )
    .Tooltip(tooltip => tooltip
        .Visible(true)
        .Template("#= series.name #: #= value #")
    )
)
Run Code Online (Sandbox Code Playgroud)

现在这是我面临的问题。这行代码:

series.Bar(new double[] { 4 }); …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc charts telerik kendo-ui

5
推荐指数
1
解决办法
6151
查看次数

几天后应用程序性能下降,更多时间花在 ntdll.dll 上

我试图找出为什么我的应用程序随着时间的推移变得更慢。应用程序将要做的工作打包成可以并发执行的批处理。每一批都必须等待前一批完成。批处理在更新函数内每~30 毫秒执行一次。在代码中,它看起来像这样:

List<List<Action>> batches = new List<List<Action>>(); // class member

foreach (var batch in batches) // inside of the update function
{
    Parallel.ForEach(batch, action => action());
}
Run Code Online (Sandbox Code Playgroud)

几天后,我发现执行所有批处理所需的时间越来越长。起初,执行大约需要 15 毫秒,然后几天后它需要超过 100 毫秒。我的目标是找出执行时间不断增加的原因。

在调试的时候,我发现批次数量和每批次的动作数量保持不变。

使用 dotTrace 进行分析表明,有时批处理中的一个操作需要更长的时间,并且Parallel.ForEach将(并且应该)等到所有先前的操作完成。在启动应用程序后立即进行分析时,仅每隔几百次更新就会出现延迟。几天后,几乎每次更新都会发生延迟。

这是它在分析器中的样子;我用不同深浅的绿色标记了各个更新周期并给它们编号。如您所见,第二次更新有明显的延迟(黄色)。

主题概览

在黄色期间,没有其他线程在做工作(至少根据分析器)。当一个一个的选择线程时,除了一个线程之外的所有线程都不在一个动作上工作。正如您在下一张图片中看到的,仍在处理某个操作的线程没有显示任何 CPU 负载,并且所有时间都花在ntdll.dll.

在此处输入图片说明

在这种情况下,对 的调用GetEnumerator大约需要 24 毫秒,但我已经看到类似ToString()ToArray()太多的函数冻结。

我观察到的相关内容:

  • 冻结与特定功能无关,可能发生在应用程序的任何部分
  • 花费的时间总是显示在 ntdll.dll
  • 通常发生在 GC 之后
  • 在分析时间内运行的所有 GC 都是 gen0
  • 被调用的函数分配内存

c# multithreading profiling garbage-collection dottrace

5
推荐指数
0
解决办法
364
查看次数

Ada/SPARK:我应该使用 GNATprove 吗?我在哪里可以找到它?

在Learning Ada的第 22.1 章中,尝试构建示例。

它期望安装 GNATprove。我使用的是 Ubuntu 18.04 LTS,但没有看到任何提供它的软件包。当我尝试查找主存储库时,我发现的只是Open Do中的内容,当我单击下载按钮时,它似乎是一个损坏的链接。Google 几乎没有提供有关 GNATprove 的信息,这有点令人担忧。

我是 Ada 新手,所以我真的不知道应该使用什么,所以如果 GNATprove 不正确,请告诉我。我通常也期望有一个免费的软件工具链——这是一个合理的期望还是我应该期望需要“专业”版本来了解 Ada/SPARK 的全部内容?

ada gnat spark-ada

4
推荐指数
1
解决办法
862
查看次数

如何从 Ada 代码中的链接描述文件访问符号?

我正在使用 GNAT 构建我的 Ada/SPARK 项目,并且使用链接器脚本。以下是摘录:

SECTIONS
{
    .code :
    {
        . = ALIGN(0x4);
        *(.text.section1)
        _end_of_section1 = .;
        *(.text.section2)
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

符号 _end_of_section1 是两个节之间的地址。我希望能够在我的 Ada 代码中访问它。我知道在 C 中使用extern char _end_of_section1[];. 在 Ada 中可以做这样的事情吗?如果没有,是否有其他方法可以在代码中获取该地址?

ada linker-scripts gnat spark-ada

4
推荐指数
1
解决办法
285
查看次数

将TableAdapter与基类,接口或部分类一起使用的更智能方法

C#ADO.Net TableAdapter对象不实现和接口,也不是基类(除Component之外).

有人在模板中使用TableAdapter(GoF-)模式吗?

更新:我想解决此处描述的问题: 通过使用模板(GoF),适配器(GoF)或其他漂亮的模式
帮助改进迁移程序
.

.net c# ado.net tableadapter

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