emulator调试日志: port篇

------------------ port 篇 -------------
open_port/2这个是由bif实现, 源文件在erl_bif_port.c中, 函数是BIF_RETTYPE open_port_2(BIF_ALIST_2)
其中:
#define BIF_RETTYPE Eterm
#define BIF_ALIST_2 Process* A__p, Eterm A_1, Eterm A_2

此函数调用了同文件中的
static int
open_port(Process* p, Eterm name, Eterm settings, int *err_nump)
函数.
name 对应 open_port/2的第一个参数PortName
setting 对应 open_port/2的第二个参数PortSettings
其中:
PortSettings = [Opt]
 Opt = {packet, N} | stream | {line, L} | {cd, Dir} | {env, Env} | exit_status | use_stdio | nouse_stdio | stderr_to_stdout | in | out | binary | eof
  N = 1 | 2 | 4
  L = int()
  Dir = string()
  Env = [{Name, Val}]
   Name = string()
   Val = string() | false
这些port的设置都由open_port函数Parse the settings注释后面的代码解析. erl_bif_port.c: 475行

第一个参数name的解析由open_port函数Parse the first argument and start the appropriate driver注释后面的代码解析. erl_bif_port.c: 590行
此处解析第一个参数name,并开启正确的driver
PortName = {spawn, Command} | {fd, In, Out}
分两种情况: spawn出来的进程, 使用文件描述符

spawn_driver_entry外部定义, spawn_driver_entry是名为spawn的driver的入口结构体. 它在linux平台上的定义在emulator/sys/unix/sys.c下
struct erl_drv_entry spawn_driver_entry = {
    spawn_init,
    spawn_start,
    stop,
    output,
    ready_input,
    ready_output,
    "spawn",
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    ERL_DRV_EXTENDED_MARKER,
    ERL_DRV_EXTENDED_MAJOR_VERSION,
    ERL_DRV_EXTENDED_MINOR_VERSION,
    ERL_DRV_FLAG_USE_PORT_LOCKING
};
erl_drv_entry这个结构体的定义的emulator/beam/erl_driver.h. 结构体的成员包括port初始化, 开始,停止, 取/出数据的各种函数指针(因为运行的平台不同,所以用指针来指定策略).
  
真正干活的是io.c下面的
/*
   Opens a driver.
   Returns the non-negative port number, if successful.
   If there is an error, -1 or -2 or -3 is returned. -2 means that
   there is valid error information in 'errno'.
   Returning -3 means that an error in the given options was detected.
   The driver start function must obey the same conventions.
*/
int
erts_open_driver(ErlDrvEntry* driver,    /* Pointer to driver entry. */
         Eterm pid,        /* Current process. */
         char* name,        /* Driver name. */
         SysDriverOpts* opts,    /* Options. */
         int *error_number_ptr)    /* errno in case -2 is returned */
函数. io.c: 505行
步骤:
    1. 获取一个free的port,取得一个port_num. 通过 static int get_free_port(void)函数来检查, 如果port的status属性为ERTS_PORT_S_FREE则这个port是free的
    2. 检查同名的driver是否已经存在.如果存在,则用已有的driver,如果不存在则用默认的spawn/fd driver
    3. drv_data = (*driver->start)((ErlDrvPort)port_num, name, opts); 初始化一些东西而已,比如driver名称,driver的io队列等
    4. 用已有的名为spawn的driver启动driver, drv_data = (*driver->start)((ErlDrvPort)port_num, name, opts); (unix/sys.c)
    5. clean up the port.
    6. 返回port_num.

附:名为efile的driver,它的struct erl_drv_entry结构体定义在emulator/drivers/comm/efile_drv.c中, 如下:
struct erl_drv_entry efile_driver_entry = {
    file_init,
    file_start,
    file_stop,
    file_output,
    NULL,
    NULL,
    "efile",
    NULL,
    NULL,
    file_control,
    file_timeout,
    file_outputv,
    file_async_ready,
    file_flush,
    NULL,
    NULL,
    ERL_DRV_EXTENDED_MARKER,
    ERL_DRV_EXTENDED_MAJOR_VERSION,
    ERL_DRV_EXTENDED_MINOR_VERSION,
    ERL_DRV_FLAG_USE_PORT_LOCKING,
    NULL
};
Android调试桥(adb)核心概念与实用命令大全 Android调试桥(adb)是连接开发机与Android设备的关键工具,通过客户端-服务器-守护进程架构实现跨平台通信。作为Android开发的基础设施,adb支持应用安装调试、文件传输、系统监控等核心功能,大幅提升开发效率。在移动应用开发领域,adb与logcat日志分析、性能优化工具链深度集成,成为CI/CD自动化测试的重要组件。本文详解adb环境配置、设备管理、应用调试等实战命令,特别包含Android 11+无线调试等新特性,帮助开发者快速掌握这个必备的Android开发利器。 阅读详情

相关推荐

Android TV模拟器环境搭建与调试全指南

Android模拟器是开发者测试移动应用的核心工具,其工作原理是通过虚拟化技术完整模拟ARM/x86架构的硬件环境。在TV应用开发领域,使用官方Android TV系统镜像能确保100%的兼容性,同时支持硬件加速和全功能调试。通过AVD Manager配置横屏显示、遥控器按键映射等TV专属特性,开发者可以高效完成焦点控制、多分辨率适配等关键测试。本文以Android Studio为例,详细演示如何从环境准备、镜像下载到性能优化的完整TV模拟器搭建流程,特别适合需要测试Android TV应用UI适配与遥控器

weixin_33725239的博客 436

根据emulator的端口进入adb设备的命令

(emulator port adb shell) 根据emulator的端口进入adb设备的命令 今天早上写一个socket的测试程序,需要开两个模拟器,一个作服务器,一个作客户端。 我设置两个模拟器的ip地址和dns,需要进入两个模拟器的adb shell,找了一会

tao_zi7890的专栏 1469

基于RemoTI RTI DLL的ZigBee RF4CE应用层开发与调试实践

在嵌入式系统开发中,片上系统(SoC)和无线通信协议栈(如ZigBee RF4CE)的集成调试往往依赖硬件开发板,这可能导致开发进程受限于硬件资源。通过动态链接库(DLL)在Windows平台模拟嵌入式API接口,开发者可以提前在PC端验证应用层逻辑,实现开发工作流的前移。RTI DLL作为TI RemoTI解决方案的桥梁库,提供了与CC253x网络处理器完全一致的编程接口,使得为嵌入式设备编写的代码能够几乎无缝移植到Win32控制台程序。这项技术的核心价值在于降低对早期硬件的依赖,加速原型验证周期。其典型

weixin_34130389的博客 358

emulator调试日志: driver篇

--------- driver篇 --------------- driver一般通过erl_ddll.erl中的load_driver/2函数来实现. load_driver(Path, Driver) ->     do_load_driver(Path, Driver, [{driver_options,[kill_ports]}]). ... do_load_driver(Pat...

coderplay的专栏 387

瑞萨CS+调试管理器与属性面板配置详解:从多核调试到故障安全

在嵌入式系统开发中,调试是连接软件逻辑与硬件行为的关键桥梁。调试工具通过仿真器或调试探针与芯片内部的调试模块通信,实现对程序执行流程、内存状态和外设行为的实时监控与控制,其核心价值在于将不可见的代码执行过程可视化、可控制。掌握高效的调试技术能显著提升开发效率,缩短问题定位时间,尤其在汽车电子、工业控制等对实时性与可靠性要求极高的领域。本文聚焦于瑞萨电子CS+集成开发环境中的调试管理器与属性面板,这两个组件是调试体系的控制中枢与参数配置台。调试管理器专为多核微控制器设计,实现了对目标核心的精准选择与状态监控;

banshen0201的博客 506

告别数据线!保姆级教程:在Android 11/12手机上开启无线ADB调试(附常见错误排查)

本文详细介绍了在Android 11/12手机上开启无线ADB调试的保姆级教程,帮助开发者告别数据线束缚。从环境准备、设备配对到高级配置和常见错误排查,全面解析无线调试的高效实践,提升移动开发效率。

weixin_30263073的博客 444

使用adb出现假emulator的解决方法

android开发中最常用的一个工具就是adb了。自己一直是用一台linux服务器连接android来做调试开发,今天在查看adb连接设备列表时#adb devices List of devices attached emulator-5554 offline emulator-5556 offline这个问题对我来说并不陌生,通常解决的方式都是执行命令adb kill-server,然后

高飞的专栏 1万+

安卓SO库动态调试实战:从环境搭建到IDA断点技巧

动态调试是深入理解程序运行时行为的关键技术,它允许开发者在程序执行过程中实时监控内存、寄存器和执行流程。其核心原理是通过调试器(如GDB或IDA Pro)与目标进程建立连接,控制其执行流并进行状态观察。这项技术的价值在于能够解决静态分析难以处理的运行时问题,例如加密算法还原、崩溃定位和代码逻辑验证。在安卓应用安全分析、Native层崩溃调试以及第三方闭源库行为理解等场景中,动态调试是不可或缺的手段。本文聚焦于安卓SO(共享对象)库的动态调试,详细介绍了如何搭建稳定的调试环境,并深入讲解了使用IDA Pro进

weixin_33736649的博客 371

探索SMALI_Emulator:Android反编译与调试的新利器

探索SMALI_Emulator:Android反编译与调试的新利器 去发现同类优质开源项目:https://gitcode.com/ 项目简介 是一个由EvilSocket开发的开源项目,旨在提供一个强大的工具,用于在Docker容器中运行和调试Smali代码。Smali是Android应用程序APK文件中的字节码语言,类似于Java的Dalvik虚拟机(DVM)使用的字节码。此项目使得开发者可...

gitblog_00100的博客 516

瑞萨CS+调试器实战指南:从环境搭建到高级技巧

在嵌入式系统开发中,调试是定位和解决软件问题的核心环节。其基本原理是通过调试器与目标微控制器建立通信,实现对程序执行流程的控制和内部状态的实时监控。这项技术的价值在于能够将“黑盒”运行过程可视化,显著提升开发效率和问题定位精度,广泛应用于汽车电子、工业控制、消费电子等领域的MCU软件开发。瑞萨电子的CS+集成开发环境内置了强大的调试器,支持硬件仿真器、串口连接和软件模拟器等多种调试工具。通过合理配置连接参数、下载模式以及利用事件系统和实时跟踪等高级功能,开发者可以构建高效的调试工作流。本文以瑞萨RH850、

weixin_33675507的博客 330

Virtual Serial Port Driver 6.9串口模拟器完整工具包

在现代IT系统开发与调试过程中,串口通信依然扮演着不可替代的角色。随着硬件设备的多样化与开发环境的虚拟化趋势增强,串口模拟器应运而生,成为连接物理世界与虚拟环境的重要桥梁。本章将从串口通信的基础出发,逐步引出串口模拟技术的必要性,并探讨其在多个关键领域的应用价值。串口模拟器(Serial Port Emulator)是一种通过软件模拟真实串口通信行为的工具,能够在没有物理串口设备的情况下,创建虚拟串口对(Virtual COM Port Pair),实现串口通信程序的开发、测试与调试。

weixin_35705784的博客 784

[ARM 汇编]高级部分—性能优化与调试—3.4.3 使用模拟器进行调试与测试

通过模拟器,我们可以在不同的处理器上测试代码,发现潜在的问题,并利用模拟器提供的丰富的调试功能提高开发效率。在实际开发过程中,应多加实践,以便更好地掌握使用模拟器进行调试与测试的技巧。在ARM汇编程序开发过程中,使用模拟器(emulator)进行调试和测试是一种非常有效的方法。模拟器可以在不同的处理器上测试代码,帮助我们发现潜在的问题,并提供丰富的调试功能。本节将介绍如何使用QEMU(一个流行的开源模拟器)进行ARM汇编程序的调试和测试。现在,你可以使用GDB的各种功能进行调试。选项指定了ARM库的路径。

Andy0214的专栏 6608

ETERM指令总结

eterm指令大全eterm指令大全eterm指令大全eterm指令大全eterm指令大全

STM32调试新姿势:用ITM和GDB脚本一键搞定串口打印,效率翻倍

本文介绍了STM32调试的新方法,通过ITM和GDB脚本实现一键串口打印,大幅提升调试效率。ITM作为ARM Cortex-M内核的调试组件,仅需ST-Link仿真器即可实现高速打印,避免了传统USB转TTL方案的硬件依赖和布线复杂问题。文章详细讲解了自动化工作流的构建,包括GDB脚本编写和CLion集成配置,帮助开发者快速掌握这一高效调试技术。

weixin_30776273的博客 513

ETERM指令培训

ETERM指令培训 查询 预定 取消PNR 一次性封口生成记录

Win11系统下Abaqus2022与VS2022+oneAPI2023环境配置全攻略(附VUMAT子程序避坑指南)

本文详细指导在Windows 11系统下,为Abaqus 2022配置Visual Studio 2022与Intel oneAPI 2023的Fortran编译环境,以支持VUMAT等用户子程序开发。内容涵盖软件安装顺序、环境变量关联、快捷方式修改及关键验证步骤,并提供了首个VUMAT子程序的实战编写与模型验证方法,帮助用户高效搭建稳定可靠的仿真开发平台。

pytorch8learner的博客 317

swtpm命令大全:从基础操作到高级调试的实用参考手册

swtpm是一款基于Libtpms的TPM模拟器,支持TPM 1.2和2.0标准,提供socket、字符设备和Linux CUSE接口,是开发和测试TPM相关应用的必备工具。本文将系统梳理swtpm的核心命令、实用参数及调试技巧,帮助用户快速掌握从基础启动到高级配置的全流程操作。 ## 一、swtpm基础启动命令 🚀 swtpm的启动命令根据接口类型和使用场景有所不同,以下是最常用的基础启动

gitblog_00946的博客 878

Camera AF和FF

Camera按对焦功能可以分为FF(Fixed Focus)和AF(Auto Focus),即固定对焦和自动对焦。固定对焦顾名思义就是焦距是固定的,而自动对焦可以通过移动镜头位置来改变焦距从而实现自动对焦。以前摄像的功能机大多是固定对焦,现在的手机都带有自动对焦功能。 FF模组包括镜头(Lens),传感器(Sensor),红外滤色器(IR Filter),电路板(PCB),镜头支撑(Lens Holder),连接器(Connector)。 Fig 1. FF Module AF模组包括FF模组,音圈马达(V

Coppa的博客 1万+

​Flow入门|Flow Emulator 工具介绍

Flow Emulator 是一个 flow 官方推出的轻量级工具 , 可以模拟实际 Flow 网络的行为 , 跟真实节点的 api 功能基本接近 , 使得开发人员可以在本地方便得进行开发和调试 . 本文会介绍如何安装和使用 Flow Emulator. 使用 Flow CLI 运行模拟器 Flow Emulator 与 Flow CLI 捆绑在一起,Flow CLI 是用于处理 Flow 的命令行界面。 1. 安装 Flow CLI linux 或者 mac (推荐) sh -ci "$...

weixin_57551966的博客 574

保姆级教程:断网环境下用Flexnet服务器搞定SolidWorks 2021安装与破解(附错误5解决方案)

本文提供SolidWorks 2021在断网环境下的企业级部署指南,详细解析Flexnet服务器本地化工作原理,并给出安装与破解的实战方案,特别针对常见的'错误5'问题提供多维度解决方案。适用于需要内网隔离或移动办公的工业设计场景,确保数据安全与授权合规。

weixin_28683391的博客 298

ROS水下仿真神器uuv_simulator:从零搭建水下机器人测试环境(附Gazebo配置全流程)

本文详细介绍了如何使用ROS和uuv_simulator从零搭建水下机器人仿真测试环境,包括Gazebo配置全流程。通过系统环境准备、水下世界构建、机器人模型定制开发等步骤,帮助开发者在虚拟海洋环境中高效验证算法,大幅降低研发成本。特别适合水下机器人研发人员参考。

ujm5678901的博客 263

鸿蒙前端调试核心:hdc链路与ArkWeb DevTools实战指南

Web前端调试通常指基于Chrome DevTools Protocol(CDP)的页面审查与性能分析,其原理依赖浏览器内核暴露的调试服务端、WebSocket通信及客户端代理。技术价值在于实现代码实时修改、断点调试与网络请求追踪,广泛应用于Vue/React单页应用、混合开发及跨端场景。在HarmonyOS生态中,这一流程被重构为hdc协议网关 + ArkWeb定制引擎 + 端口反向代理的三层链路,其中hdc不仅是设备连接工具,更是打通PC与设备间调试隧道的关键枢纽;ArkWeb DevTools Ser

weixin_34414650的博客 483

医疗影像分析实战:肺炎X光片分类与分割

医疗影像分析实战:肺炎X光片分类与分割 ,人工智能,计算机视觉,大模型,AI,在医疗领域,医疗影像分析技术凭借其高效、精准的特点,成为疾病诊断与治疗的重要辅助手段。肺炎作为一种常见的呼吸道疾病,严重威胁人类健康,通过 X 光片对肺炎进行诊断是临床常用方法。利用计算机技术实现肺炎 X 光片的自动分类与分割,不仅能减轻医生的工作负担,还能提高诊断的准确性和效率。本文将深入讲解肺炎 X 光片分类与分割的实战过程,结合大量代码示例和关键概念解析,帮助读者掌握相关技术。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+
上一篇: supervisor一小技巧
下一篇: 修正Programming Erlang中linked driver实例的小问题
coderplay
博客等级 码龄19年 6粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值