高通camx IOVA内存不足,导致10-15x持续拍照后,点击拍照键定屏无反应,过一会相机闪退

定屏闪退问题分析思路:

  1. 定屏问题如果是相机问题,一般会出现返帧,导致预览卡死。当然还有其他情况,我们先看返帧情况,发现request和result开始都正常,到12:53:05.443038就没有返帧了,定屏了。往下排查。
行 53944: 01-01 12:53:03.429684  1825 16891 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:1810 process_capture_request()     output_buffers[0] : 0xb400007c12beeb80, buffer: 0x7e15dbeb40, status: 00000000, stream: 0xb400007d52135ea8行 53945: 01-01 12:53:03.429696  1825 16891 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:1810 process_capture_request()     output_buffers[1] : 0xb400007c12beeba0, buffer: 0x7e15dbeb40, status: 00000000, stream: 0xb400007d52135ba8行 56194: 01-01 12:53:04.423164  1825  3582 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2075 process_capture_result() frame_number 584, partial_result 1, result 0xb400007d52c0d780, num_physcam_metadata 0, num_output_buffers 0行 56385: 01-01 12:53:04.446711  1825  3582 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2075 process_capture_result() frame_number 581, partial_result 2, result 0xb400007d21c2b0c0, num_physcam_metadata 1, num_output_buffers 0行 56442: 01-01 12:53:04.456509  1825  3582 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2075 process_capture_result() frame_number 581, partial_result 0, result 0x0, num_physcam_metadata 0, num_output_buffers 1行 56443: 01-01 12:53:04.456514  1825  3582 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2106 process_capture_result()     output_buffers[0] : 0xb400007ca6da5700, buffer: 0xb400007caa52f758, status: 00000000, stream: 0xb400007d52135ea8行 56495: 01-01 12:53:04.457988  1825  3580 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2075 process_capture_result() frame_number 580, partial_result 0, result 0x0, num_physcam_metadata 0, num_output_buffers 1行 56496: 01-01 12:53:04.457994  1825  3580 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2106 process_capture_result()     output_buffers[0] : 0xb400007ca6da5700, buffer: 0xb400007ca72d9178, status: 00000000, stream: 0xb400007d52135ba8行 58262: 01-01 12:53:05.443033  1825  3581 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2075 process_capture_result() frame_number 605, partial_result 0, result 0x0, num_physcam_metadata 0, num_output_buffers 1行 58263: 01-01 12:53:05.443038  1825  3581 I CamX    : [CONFIG][HAL    ] camxhal3.cpp:2106 process_capture_result()     output_buffers[0] : 0xb400007ca6da5700, buffer: 0xb400007ca63e6918, status: 00000000, stream: 0xb400007d52135ba8
  1. 发现日志里有crash日志,camx hal在12:53:05.931crash了,这个时间前面已经出现问题了,导致定屏并crash。
01-01 12:53:06.362630 24257 24257 F DEBUG   : Timestamp: 2024-01-01 12:53:05.931813851+0800
01-01 12:53:06.362634 24257 24257 F DEBUG   : Process uptime: 0s
01-01 12:53:06.362642 24257 24257 F DEBUG   : Cmdline: /vendor/bin/hw/vendor.qti.camera.provider@2.7-service_64
01-01 12:53:06.362646 24257 24257 F DEBUG   : pid: 1825, tid: 3581, name: SoloTMgr_1  >>> /vendor/bin/hw/vendor.qti.camera.provider@2.7-service_64 <<<
01-01 12:53:06.362652 24257 24257 F DEBUG   : uid: 1047
01-01 12:53:06.362658 24257 24257 F DEBUG   : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
01-01 12:53:06.362663 24257 24257 F DEBUG   : pac_enabled_keys: 000000000000000f (PR_PAC_APIAKEY, PR_PAC_APIBKEY, PR_PAC_APDAKEY, PR_PAC_APDBKEY)
01-01 12:53:06.362669 24257 24257 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0000000000000000
01-01 12:53:06.362674 24257 24257 F DEBUG   : Cause: null pointer dereference
01-01 12:53:06.362678 24257 24257 F DEBUG   : Abort message: 'otp info index = 0 :value = 6500, (0.523098, 0.535230), (0.522952, 0.531020) !'
01-01 12:53:06.362689 24257 24257 F DEBUG   :     x0  b400007bc959f000  x1  0000000000000001  x2  0000000000000000  x3  0000000000000002
01-01 12:53:06.362694 24257 24257 F DEBUG   :     x4  b400007c25350618  x5  0000000000000000  x6  0000000000000000  x7  00000000ffffffff
01-01 12:53:06.362700 24257 24257 F DEBUG   :     x8  0000007d92de5000  x9  0000007d91afcdf0  x10 0000000000000dfd  x11 0000000000000150
01-01 12:53:06.362705 24257 24257 F DEBUG   :     x12 000000000000000d  x13 0000007c25200000  x14 0000000000000020  x15 0000000000000000
01-01 12:53:06.362710 24257 24257 F DEBUG   :     x16 0000000000000001  x17 0000007e1792ccac  x18 b400007cb2cadc40  x19 0000000000000000
01-01 12:53:06.362715 24257 24257 F DEBUG   :     x20 0000000000000001  x21 0000007d35f0afd0  x22 0000000000000001  x23 0000007d93a283a8
01-01 12:53:06.362720 24257 24257 F DEBUG   :     x24 00000000000009a0  x25 b400007bc95bf340  x26 0000007d35e890a0  x27 0000000000000000
01-01 12:53:06.362726 24257 24257 F DEBUG   :     x28 b400007bc95b7060  x29 0000007d35e52b90
01-01 12:53:06.362731 24257 24257 F DEBUG   :     lr  0044e67d9203f61c  sp  0000007d35e52b70  pc  0000007d92c34a68  pst 0000000080001000
01-01 12:53:06.362737 24257 24257 F DEBUG   : 8 total frames
01-01 12:53:06.362741 24257 24257 F DEBUG   : backtrace:
01-01 12:53:06.362749 24257 24257 F DEBUG   :       #00 pc 000000000140aa68  /vendor/lib64/hw/camera.qcom.so (CamX::Node::GetCmdBufferForRequest(unsigned long, CamX::CmdBufferManager*)+48) (BuildId: bf5bd295751ef5290f0cfc3d8c2839df)
01-01 12:53:06.362757 24257 24257 F DEBUG   :       #01 pc 0000000000815618  /vendor/lib64/hw/camera.qcom.so (CamX::IPENode::ExecuteProcessRequest(CamX::ExecuteProcessRequestData*)+71296) (BuildId: bf5bd295751ef5290f0cfc3d8c2839df)
01-01 12:53:06.362762 24257 24257 F DEBUG   :       #02 pc 00000000013ee268  /vendor/lib64/hw/camera.qcom.so (CamX::Node::ProcessRequest(CamX::NodeProcessRequestData*, unsigned long)+9720) (BuildId: bf5bd295751ef5290f0cfc3d8c2839df)
01-01 12:53:06.362767 24257 24257 F DEBUG   :       #03 pc 000000000135ff60  /vendor/lib64/hw/camera.qcom.so (CamX::DeferredRequestQueue::DeferredWorkerWrapper(void*) (.cfi)+680) (BuildId: bf5bd295751ef5290f0cfc3d8c2839df)
01-01 12:53:06.362773 24257 24257 F DEBUG   :       #04 pc 000000000002d8f4  /vendor/lib64/libcamxcommonutils.so (CamX::ThreadCore::DispatchJob(CamX::RuntimeJob*)+628) (BuildId: b72d1bc00ef4147f5e1d08acf77e8bd9)
01-01 12:53:06.362778 24257 24257 F DEBUG   :       #05 pc 000000000002e8b4  /vendor/lib64/libcamxcommonutils.so (CamX::ThreadCore::WorkerThreadBody
  1. 我们看下这个和buffer相关的crash当前线程情况。发现并没有特别报错。
    行 131: 01-01 12:53:05.451298  1825  3581 I CamX    : [ INFO][CORE   ] camxpipeline.cpp:1998 ProcessRequest() Pipeline:MultiCameraCustomSATEIS0_0_cam_2 requestId:608, Tuning mode: default 0, sensor 24, usecase 0, feature1, 23 feature2 0, scene 0, effect 0行 133: 01-01 12:53:05.451302  1825  3581 I CamX    : [ INFO][CORE   ] camxpipeline.cpp:2046 ProcessRequest() Pipeline::MultiCameraCustomSATEIS0_0_cam_2 last submitted request updated to 608 pointer:0xb400007c900ff000行 135: 01-01 12:53:05.451334  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9466 SetupRequestOutputPortFence() CreatePrivateFence... Node: cb0a0000, Node::MultiCameraCustomSATEIS0_com.arcsoft.node.smooth_transition1_cam2, fence: b4e62020(9), Port: 0, portIndex 0 reqId: 608, ImgBuf: 0x0, portidx/groupID 1 result: 0 行 137: 01-01 12:53:05.451346  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9595 SetupRequestOutputPortFence() CreatePrivateFence...Node: cb0a0000, Node::MultiCameraCustomSATEIS0_com.arcsoft.node.smooth_transition1_cam2, fence: b4e65820(12), ImgBuf:0x0 reqId:608 result: 0行 138: 01-01 12:53:05.451385  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9466 SetupRequestOutputPortFence() CreatePrivateFence... Node: 845eb000, Node::MultiCameraCustomSATEIS0_com.qti.node.gpu0_cam2, fence: b4e54020(14), Port: 1, portIndex 0 reqId: 608, ImgBuf: 0x0, portidx/groupID 1 result: 0 行 139: 01-01 12:53:05.451392  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9595 SetupRequestOutputPortFence() CreatePrivateFence...Node: 845eb000, Node::MultiCameraCustomSATEIS0_com.qti.node.gpu0_cam2, fence: b4e57820(19), ImgBuf:0x0 reqId:608 result: 0行 143: 01-01 12:53:05.451786  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9466 SetupRequestOutputPortFence() CreatePrivateFence... Node: 845eb000, Node::MultiCameraCustomSATEIS0_com.qti.node.gpu0_cam2, fence: b4e5b020(21), Port: 2, portIndex 1 reqId: 608, ImgBuf: 0x0, portidx/groupID 2 result: 0 行 144: 01-01 12:53:05.451796  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9595 SetupRequestOutputPortFence() CreatePrivateFence...Node: 845eb000, Node::MultiCameraCustomSATEIS0_com.qti.node.gpu0_cam2, fence: b4e5e820(22), ImgBuf:0x0 reqId:608 result: 0行 145: 01-01 12:53:05.451831  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9466 SetupRequestOutputPortFence() CreatePrivateFence... Node: bd2a0000, Node::MultiCameraCustomSATEIS0_com.arcsoft.node.eisv23_cam2, fence: b4e70020(24), Port: 0, portIndex 0 reqId: 608, ImgBuf: 0x0, portidx/groupID 1 result: 0 行 146: 01-01 12:53:05.451838  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9595 SetupRequestOutputPortFence() CreatePrivateFence...Node: bd2a0000, Node::MultiCameraCustomSATEIS0_com.arcsoft.node.eisv23_cam2, fence: b4e73820(26), ImgBuf:0x0 reqId:608 result: 0行 147: 01-01 12:53:05.451852  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9466 SetupRequestOutputPortFence() CreatePrivateFence... Node: bd2a0000, Node::MultiCameraCustomSATEIS0_com.arcsoft.node.eisv23_cam2, fence: b4e77020(37), Port: 1, portIndex 1 reqId: 608, ImgBuf: 0x0, portidx/groupID 2 result: 0 行 148: 01-01 12:53:05.451858  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9595 SetupRequestOutputPortFence() CreatePrivateFence...Node: bd2a0000, Node::MultiCameraCustomSATEIS0_com.arcsoft.node.eisv23_cam2, fence: b4e7a820(38), ImgBuf:0x0 reqId:608 result: 0行 149: 01-01 12:53:05.451875  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9466 SetupRequestOutputPortFence() CreatePrivateFence... Node: 21436000, Node::MultiCameraCustomSATEIS0_EVA10_cam2, fence: b5d87c20(39), Port: 1, portIndex 0 reqId: 608, ImgBuf: 0x0, portidx/groupID 2 result: 0 行 150: 01-01 12:53:05.451885  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9466 SetupRequestOutputPortFence() CreatePrivateFence... Node: 21436000, Node::MultiCameraCustomSATEIS0_EVA10_cam2, fence: b5d89420(39), Port: 2, portIndex 1 reqId: 608, ImgBuf: 0x0, portidx/groupID 2 result: 0 行 152: 01-01 12:53:05.451902  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9466 SetupRequestOutputPortFence() CreatePrivateFence... Node: 2140d000, Node::MultiCameraCustomSATEIS0_IPE10_cam2, fence: b4e80b20(43), Port: 8, portIndex 0 reqId: 608, ImgBuf: 0x0, portidx/groupID 1 result: 0 行 154: 01-01 12:53:05.451920  1825  3581 I CamX    : [ INFO][CORE   ] camxnode.cpp:9466 SetupRequestOutputPortFence() CreatePrivateFence
  1. 我们继续看下crash的代码,发现是高通原生代码,这里也一般不会出现错误。
8004  CmdBuffer* Node::GetCmdBufferForRequest(
8005      UINT64              requestId,
8006      CmdBufferManager*   pCmdBufferManager)
8007  {
8008      CAMX_ASSERT(NULL != pCmdBufferManager);
8009  
8010      PacketResource* pPacketResource = NULL;
8011  
8012      if (CamxResultSuccess == pCmdBufferManager->GetBufferForRequest(GetCSLSyncId(requestId), &pPacketResource))
8013      {
8014          CAMX_ASSERT(TRUE == pPacketResource->GetUsageFlags().cmdBuffer);
8015      }
8016  
8017      // We know pPacketResource actually points to a CmdBuffer so we may static_cast
8018      return static_cast<CmdBuffer*>(pPacketResource);
8019  }
  1. 用户态没有明显报错,我们看下kernel KMD日志,发现高通camx IOVA内存不足导致的分配不到足够内存导致ISP request一直处于wait,KMD CRM一直not ready on link,最终用户态也wait。
<6>[ 6646.900716][T503585] CAM_ERR: CAM-SMMU: cam_smmu_map_buffer_validate: 2169 IOVA alloc failed for shared memory, size=10620928, idx=2, handle=162019
<6>[ 6646.900733][T503585] CAM_ERR: CAM-SMMU: cam_smmu_map_buffer_and_add_to_list: 2310 buffer validation failure
<6>[ 6646.900735][T503585] CAM_ERR: CAM-SMMU: cam_smmu_map_user_iova: 3311 mapping or add list fail cb:icp idx=2, fd=803, region=1, rc=-12
<6>[ 6646.900737][T503585] CAM_ERR: CAM-SMMU: cam_smmu_dump_cb_info: 610 ********** 4:53:5:639 Context bank dump for icp **********
<6>[ 6646.900739][T503585] CAM_ERR: CAM-SMMU: cam_smmu_dump_cb_info: 616 Usage: shared_usage=254640128 io_usage=705449984 shared_free=9601024 io_free=3290673152
<6>[ 6646.900742][T503585] CAM_ERR: CAM-MEM: cam_mem_util_map_hw_va: 880 Failed secured map to smmu, i=0, fd=803, dir=0, mmu_hdl=162019, rc=-12
<6>[ 6646.900744][T503585] CAM_ERR: CAM-MEM: cam_mem_mgr_alloc_and_map: 987 Failed in map_hw_va len=10620928, flags=0x859, fd=803, region=1, num_hdl=1, rc=-12
<6>[ 6646.911541][    C2] CAM_INFO: CAM-ISP: __cam_isp_ctx_check_deferred_buf_done: 2203 Buf done with no active request but with req in wait list, req 615 last apply id:615 last err id:0
<6>[ 6646.935116][T221544] CAM_INFO: CAM-CRM: __cam_req_mgr_find_dev_name: 245 Skip Frame: req: 617 not ready on link: 0x490126 for pd: 2 dev: cam-sensor open_req count: 3
  1. 经过分析高通 IOVA内存在kernel dts就固定了size,我们调整大小,复测pass。
			dma-coherent;icp_iova_mem_map: iova-mem-map {iova-mem-region-shared {/* Shared region is ~350MB long */iova-region-name = "shared";iova-region-start = <0x800000>;iova-region-len = <0x16000000>;  //长度增加即可。iova-region-id = <0x1>;status = "ok";

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI知识补全(十五):AI可解释性与透明度是什么?

名人说&#xff1a;一笑出门去&#xff0c;千里落花风。——辛弃疾《水调歌头我饮不须劝》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;AI知识补全&#xff08;十四&#xff09;&#xff1a;零样本…

CentOS 7安装hyperscan

0x00 前言 HyperScan是一款由Intel开发的高性能正则表达式匹配库&#xff0c;专为需要快速处理大量数据流的应用场景而设计。它支持多平台运行&#xff0c;包括Linux、Windows和macOS等操作系统&#xff0c;并针对x86架构进行了优化&#xff0c;以提供卓越的性能表现。HyperSc…

机器学习的一百个概念(9)学习曲线

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…

macvlan 和 ipvlan 实现原理及设计案例详解

一、macvlan 实现原理 1. 核心概念 macvlan 允许在单个物理网络接口上创建多个虚拟网络接口&#xff0c;每个虚拟接口拥有 独立的 MAC 地址 和 IP 地址。工作模式&#xff1a; bridge 模式&#xff08;默认&#xff09;&#xff1a;虚拟接口之间可直接通信&#xff0c;类似交…

linux文件上传下载lrzsz

lrzsz 是一个在 Linux 系统中用于通过串行端口(如 ZMODEM、XMODEM、YMODEM 等协议)进行文件上传和下载的工具集。它通常用于在终端环境中通过串口或 SSH 连接传输文件。 安装 lrzsz 在大多数 Linux 发行版中,你可以使用包管理器来安装 lrzsz。 Debian/Ubuntu: sudo apt-ge…

单片机学习之SPI

物理层 串行全双工总线 需要四根线&#xff1a;SCLK&#xff08;时钟线&#xff09;&#xff0c;CS&#xff08;片选线&#xff09;、MOSI(主设备输出、从设备输入)&#xff0c;MISO&#xff08;主设备输入&#xff0c;从设备输出&#xff09;。 片选信号 片选信号CS是用来…

大模型应用初学指南

随着人工智能技术的快速发展&#xff0c;检索增强生成&#xff08;RAG&#xff09;作为一种结合检索与生成的创新技术&#xff0c;正在重新定义信息检索的方式&#xff0c;RAG 的核心原理及其在实际应用中的挑战与解决方案&#xff0c;通用大模型在知识局限性、幻觉问题和数据安…

docker-compose部署prometheus+grafana+node_exporter+alertmanager规则+邮件告警

目录 一.docker-compose文件 二.配置文件 三.文件层级关系&#xff0c;docker-compose和配置文件位于同级目录 四.node_exporter页面json文件 五.效果展示 prometheusalertmanager邮件告警 grafana面板效果 六.涉及离线包 一.docker-compose文件 [rootsulibao prometh…

AI设计再现新引擎,科技创新又添新动能——广东省首家行业AI设计工程中心获批成立

近期&#xff0c;大捷智能科技&#xff08;广东&#xff09;有限公司&#xff08;以下简称“大捷智能”&#xff09;凭借其在人工智能与智能制造领域的突出研发实力与创新科技成果&#xff0c;由广东省科技厅批准设立“广东省模具智能设计与智能制造工程技术研究中心”。 广东省…

【MongoDB + 向量搜索引擎】MongoDB Atlas 向量搜索 提供全托管解决方案

在代码审计项目中&#xff0c;MongoDB可以用于存储元数据和部分结构化信息&#xff0c;但要高效处理向量相似性搜索&#xff0c;需结合其他工具。以下是具体分析&#xff1a; 1. MongoDB 的适用场景 元数据存储&#xff1a; 存储代码片段的文件路径、行号、语言类型等结构化信…

基于ANSYS 概率设计和APDL编程的结构可靠性设计分析

01 可靠度基本理论 结构的极限状态&#xff1a;整个结构的一部分超过某一特定状态就不能满足设计规定的某一功能要求。结构的极限状态实质上是结构工作状态的一个阀值&#xff0c;如果工作状态超过这一阀值&#xff0c;则结构处于不安全、不耐久或不适用的状态&#xff1b;若工…

CyclicBarrier、Semaphore、CountDownLatch的区别,适用场景

CyclicBarrier、Semaphore 和 CountDownLatch 是 Java 并发包中用于线程协作的工具类&#xff0c;它们虽然都与线程同步相关&#xff0c;但设计目的和使用场景有显著差异。以下是它们的核心区别和典型应用场景&#xff1a; 1. CountDownLatch 核心机制 一次性计数器&#xf…

新能源汽车测试中的信号调理模块:从原理到实战应用

摘要 信号调理模块&#xff08;Signal Conditioning Module, SCM&#xff09;是新能源汽车&#xff08;NEV&#xff09;测试系统中的关键环节&#xff0c;直接影响数据采集的精度与可靠性。本文面向HIL测试工程师、电机测试工程师及整车动力经济性测试工程师&#xff0c;系统性…

Qt5 Mac系统检查休眠

在开发跨平台应用程序时,有时候我们需要检测系统的状态,比如是否处于休眠或唤醒状态。Qt是一个强大的跨平台应用开发框架,支持多种操作系统,包括Windows、Linux、macOS等。在这个场景下,我们关注的是如何在Qt5.10中检测到系统是否休眠以及在Mac上实现这一功能。本文将深入…

RabbitMQ简单介绍和安装

RabbitMQ简单介绍 一.RabbitMQ介绍二.RabbitMQ的作用1.异步解耦2.流量削峰3.消息分发4.延迟通知 三.RabbitMQ安装&#xff08;Ubuntu&#xff09;1.先安装Erlang2.安装RabbitMQ3.安装RabbitMQ的管理界面4.创建虚拟机5.端口号信息 四.工作原理图 一.RabbitMQ介绍 RabbitMQ 是一款…

汇编学习之《call, return指令》

call 指令 call 指令就是调用函数的执行&#xff0c;不过它也是几个指令的组合 第一步通过jmp 函数地址的方式先跳转到函数 第二步通过push 指令将函数地址指令额下一行的指令的地址压入栈中。 我们来验证下 首先打开OllyDbg,导入你的程序&#xff0c;找到一个call 函数&…

接口自动化学习三:参数化parameterize

使用parametrize之前&#xff1a; def add(x,y):return xy class TestAddFunction(object):def test01(self):resadd(2,4)assert 6resdef test02(self):resadd(4,6)assert 10resparametrize参数化之后&#xff1a; import pytest def add(x,y):return xydata[(10,20,30),(200…

全面解析 Mybatis 与 Mybatis-Plus:深入原理、实践案例与高级特性对比

全面解析 Mybatis 与 Mybatis-Plus&#xff1a;深入原理、实践案例与高级特性对比 &#x1f680; 前言一、基础介绍 ✨1. Mybatis 简介 &#x1f50d;2. Mybatis-Plus 简介 ⚡ 二、核心区别与高级特性对比 &#x1f50e;1. 开发模式与配置管理2. 功能丰富度与扩展性3. 自动填充…

【区块链安全 | 第十九篇】类型之映射类型

文章目录 映射类型可迭代映射 映射类型 映射类型使用语法 mapping(KeyType KeyName? > ValueType ValueName?)&#xff0c;映射类型的变量声明使用语法 mapping(KeyType KeyName? > ValueType ValueName?) VariableName。 KeyType 可以是任何内置值类型、bytes、st…

动态循环表单+动态判断表单类型+动态判断表单是否必填方法

页面效果&#xff1a; 接口请求到的数据格式&#xff1a; list: [{demandType: "设备辅助功能要求",demandSettingList: [{id: "1907384788664963074",name: "测试表单",fieldType: 0,contentValue: "",vaildStatus: 0, // 0 非必填&a…