[英]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 项目文件夹。
最后,在return a + b
行设置断点,然后单击Local Windows Debugger
按钮。 执行在 Visual Studio 调试器中按预期暂停,局部变量 a 和 b 的值可见,等等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.