繁体   English   中英

当 dart:ffi 方法失败时如何获得有用的错误消息?

[英]How to get a useful error message when a dart:ffi method fails?

我有一个 dart 方法,它使用 dart:ffi 调用一些 C 代码。 当 C 代码失败时(例如由于某些 memory 违规),我没有收到任何错误消息来指示出了什么问题,但只有整个过程立即退出并显示这些消息:

[+41627 ms] Service protocol connection closed.
[        ] Lost connection to device.
[   +1 ms] DevFS: Deleting filesystem on the device (file:...)

我不是在询问捕获错误,因为我知道这些类型的错误是致命的,我只是想要一些有用的日志来查看发生了什么。

我能否以某种方式调试本机代码或至少获得有关崩溃原因/位置的有用错误消息?

假设:使用纯 Dart 测试线束在 Windows 上调试 Windows DLL。 对于 Flutter 测试工具(即 Flutter 插件项目中的示例应用程序),它的工作原理几乎相同,但很可能您希望在尽可能简单的测试环境中进行大部分测试。

您将需要两个项目:一个 Visual Studio DLL 项目和一个纯 Dart 命令行。 (在接下来的内容中,我的示例分别位于d:\vcc\Dll2\d:\source\testffi2\中。Dart 项目在bin\testffi2.dart中有一个main的 function。)

为了进行测试,我删除了 VS C++ DLL 项目样板并将其替换为:

#include "pch.h"
#include "framework.h"
#include "Dll2.h"

#include <cstdint>

extern "C" __declspec(dllexport) int32_t sum(int32_t a, int32_t b) {
    return a + b;
}

并检查它是否编译正常(在 Debug/x64 配置中)。 这构建: D:\vcc\Dll2\x64\Debug\Dll2.dll如预期的那样。

在 Dart 项目中,我创建了一个简单的测试工具来加载 DLL 和 function 并调用它。

import 'dart:ffi';
import 'dart:io';

void main() {
  final dll = DynamicLibrary.open('D:\\vcc\\Dll2\\x64\\Debug\\Dll2.dll');
  final sumFunction = dll.lookupFunction<
      Int32 Function(
    Int32 a,
    Int32 b,
  ),
      int Function(
    int a,
    int b,
  )>('sum');

  print(sumFunction(123, 321));

  sleep(Duration(seconds: 5)); // this is just there so that the VCC debug
                               // window doesn't immediately close
}

运行它是 Dart IDE 或从命令行确实按预期打印444 ,但不会让您有机会调试 C。

最后,返回 Visual Studio 项目,更改调试属性以启动 Dart 测试工具。 将 exe 路径设置为 Dart sdk 二进制文件,将命令行设置为 Dart 主文件,并将工作文件夹设置为 Dart 项目文件夹。

VS 调试属性

最后,在return a + b行设置断点,然后单击Local Windows Debugger按钮。 执行在 Visual Studio 调试器中按预期暂停,局部变量 a 和 b 的值可见,等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM