长沙网站制作公司有哪些/厦门关键词排名优化

长沙网站制作公司有哪些,厦门关键词排名优化,ai生成网页设计,wordpress幻灯片背景: Xt160Api, 之前在windows下用.net调用,没有任何问题。 但是移植到Linux去后,.net程序 调用 init(config_path) 总是报错 /root/test 找不到 traderApi.ini (/root/test 是程序目录) 然后退出程序 解决过程: 于是考虑是不是参数传错了&…

背景
Xt160Api, 之前在windows下用.net调用,没有任何问题。
但是移植到Linux去后,.net程序 调用 init(config_path) 总是报错 /root/test 找不到 traderApi.ini (/root/test 是程序目录) 然后退出程序

解决过程:
于是考虑是不是参数传错了,但是无论这个参数是什么, 报错内容始终如此。
甚至某些情况下,比如加了几句Console.WriteLIne(app_exe_folder) 还会出现段错误,这个问题至今也没想明白。
尊崇爱因斯坦的指导意见: 不要做相同的事情,期望得到不同的结果
用Visual Studio远程编译 Linux C++ 程序 调用 init函数 。 发现 confg_path 可以被识别,如果config_path下没有ini存在,他会报错没有在 config_path下找到 traderApi.ini 而不是 .net 那样永远显示: /root/test 下找不到traderApi.ini
这个让我极度困惑,我甚至尝试用 unsafe模式,硬编码字符串,传入 init的参数, 但是输出依旧。

我甚至认为这个api收到了 .net 的路径影响,因为linux调用 .net 形如 dotnet ./MyApp.dll 这个api在查找ini时用的是 dotnet 的路径,而显示的时候用的是dll的路径。(最后证明这个逻辑完全不对) 所以我在 dotnet 的文件夹下添加了 traderApi.ini , 依旧如故。

于是我又转而认为2点,

  1. api 的指针有问题,可能我的EntryPoint写错了?
  2. 虚表有问题,什么地方写错了?但是 init 函数是第3个函数,前2个是 析构函数,setCallbak 函数, 之后就是 init 函数

非常疑惑,而且沮丧,觉得很无聊,甚至在想是不是.net core 3.1的bug? 要不要换.net8试试? 搞得我很烦。
但是还是掩盖烦躁,开始用c++写 so文件 TestSO.so
如下:
test.cpp:

#include "mylib.h"
#include "XtTraderApi.h"
#include<cstdio>extern "C"
{void MyInit(void* api, const char* path){printf("%s", "start start!!!");auto xt_api = (xti::XtTraderApi*)api;xt_api->init(path);printf("%s", path);printf("ok ok ok\r\n");		//auto xtApi = (xti::XtTraderApi*)api;//xtApi->init(path);}
}

mylib.h

#ifndef MYLIB_H
#define MYLIB_H#ifdef __cplusplus
extern "C" 
{
#endif// 声明 MyInit 函数void MyInit(void* api, const char* path);#ifdef __cplusplus
}
#endif#endif // MYLIB_H

远程编译后,把 so文件送入 /lib64 (映射后实际位置为/usr/lib64)
然后 ldconfig
最后用 ldconfig -p | grep libTest确认生效:
在这里插入图片描述
接下去先用c++ 程序调用TestSO.so, 传入 api的地址和config_path,一切正常!
说明so文件运行正确。
接下去就用C#程序调用TestSO.so, 传入 .net 中根据EntryPoint得到的 api地址,这次在so文件中调用 init函数居然一切正常!!
这样我们几乎就确定了那个我们认为最不可能有问题的 虚表 问题了!
但是怎么会?如果虚表有问题,说明函数地址是错的,调用不应该是直接崩溃,或者输出的是其他信息,怎么会返回 init函数的错误信息呢?
觉得非常不可思议,不可能啊。(但是,就是如此,原因很难想象)

如果虚表有问题,我还是只能从 C++ 是如何调用 api->init 的代码,反汇编,看看 init 在虚表中的位置。
Visual Studio 支持 Linux 远程反汇编 nice!
api->init 的汇编如下:

0x0000000000400fc1 e8 8a fe ff ff       callq  0x400e50 <_ZN3xti11XtTraderApi17createXtTraderApiEPKc@plt> 
0x0000000000400fc6 48 89 45 c0          mov    %rax,-0x40(%rbp) 
0x0000000000400fca 48 8b 45 c0          mov    -0x40(%rbp),%rax 
0x0000000000400fce 48 8b 00             mov    (%rax),%rax 
0x0000000000400fd1 48 83 c0 18          add    $0x18,%rax 
0x0000000000400fd1 48 83 c0 18          add    $0x18,%rax 
0x0000000000400fd5 48 8b 10             mov    (%rax),%rdx 
0x0000000000400fd8 48 8b 45 c0          mov    -0x40(%rbp),%rax 
0x0000000000400fdc be 80 7f 40 00       mov    $0x407f80,%esi 
0x0000000000400fe1 48 89 c7             mov    %rax,%rdi 
0x0000000000400fe4 ff d2                callq  *%rdx

注意这两句不知道为什么被Visual Studio 重复了2行,注意看他们地址是一样的,说明是一条指令,而不是两条指令。
而且这条语句极其重要,确定了init函数在虚表的位置。

0x0000000000400fd1 48 83 c0 18          add    $0x18,%rax 
0x0000000000400fd1 48 83 c0 18          add    $0x18,%rax 

神奇的是,deepseek直接把他们正确的识别为了1条语句。下面是他的解答:

This is a more complex snippet of x86-64 assembly code. Let’s break it down step by step:

  1. 0x0000000000400fc1 e8 8a fe ff ff callq 0x400e50 _ZN3xti11XtTraderApi17createXtTraderApiEPKc@plt

Address: 0x0000000000400fc1
Opcode: e8 8a fe ff ff

Instruction: callq 0x400e50

Description: This calls the function
_ZN3xti11XtTraderApi17createXtTraderApiEPKc located at address 0x400e50. The function name is mangled and corresponds to a C++ method
xti::XtTraderApi::createXtTraderApi(char const*). The @plt indicates
that this is a dynamically linked function via the Procedure Linkage
Table (PLT).

Purpose: This is likely creating an instance of the XtTraderApi class.

  1. 0x0000000000400fc6 48 89 45 c0 mov %rax,-0x40(%rbp)

Address: 0x0000000000400fc6

Opcode: 48 89 45 c0

Instruction: mov %rax, -0x40(%rbp)

Description: The return value of the createXtTraderApi function
(stored in rax) is moved into the memory location at -0x40 bytes
offset from the base pointer (rbp). This is likely storing the pointer
to the newly created XtTraderApi object in a local variable.

  1. 0x0000000000400fca 48 8b 45 c0 mov -0x40(%rbp),%rax

Address: 0x0000000000400fca

Opcode: 48 8b 45 c0

Instruction: mov -0x40(%rbp), %rax

Description: The pointer to the XtTraderApi object (stored at
-0x40(%rbp)) is loaded back into the rax register.

  1. 0x0000000000400fce 48 8b 00 mov (%rax),%rax

Address: 0x0000000000400fce

Opcode: 48 8b 00

Instruction: mov (%rax), %rax

Description: This dereferences the pointer in rax (which points to the
XtTraderApi object) and loads the value at that memory location into
rax. In C++ terms, this is likely accessing the vtable (virtual table)
pointer of the XtTraderApi object, which is typically the first member
of an object with virtual methods.

  1. 0x0000000000400fd1 48 83 c0 18 add $0x18,%rax

Address: 0x0000000000400fd1

Opcode: 48 83 c0 18

Instruction: add $0x18, %rax

Description: This adds 0x18 (24 in decimal) to the value in rax. Since
rax currently holds the vtable pointer, this is likely calculating the
address of a specific entry in the vtable. The offset 0x18 suggests
that this is the 4th entry in the vtable (assuming each entry is 8
bytes on a 64-bit system).

  1. 0x0000000000400fd5 48 8b 10 mov (%rax),%rdx

Address: 0x0000000000400fd5

Opcode: 48 8b 10

Instruction: mov (%rax), %rdx

Description: This dereferences the address in rax (which now points to
a specific vtable entry) and loads the value at that memory location
into rdx. This value is likely a function pointer corresponding to a
virtual method in the XtTraderApi class.

  1. 0x0000000000400fd8 48 8b 45 c0 mov -0x40(%rbp),%rax

Address: 0x0000000000400fd8

Opcode: 48 8b 45 c0

Instruction: mov -0x40(%rbp), %rax

Description: The pointer to the XtTraderApi object (stored at
-0x40(%rbp)) is loaded back into rax. This is likely preparing the this pointer for the virtual method call.

  1. 0x0000000000400fdc be 80 7f 40 00 mov $0x407f80,%esi

Address: 0x0000000000400fdc

Opcode: be 80 7f 40 00

Instruction: mov $0x407f80, %esi

Description: The immediate value 0x407f80 is moved into the esi
register. This is likely an argument being passed to the virtual
method.

  1. 0x0000000000400fe1 48 89 c7 mov %rax,%rdi

Address: 0x0000000000400fe1

Opcode: 48 89 c7

Instruction: mov %rax, %rdi

Description: The pointer to the XtTraderApi object (in rax) is moved
into rdi. In the System V AMD64 ABI, rdi is used for the first
argument to a function, which in this case is the this pointer for the
virtual method call.

  1. 0x0000000000400fe4 ff d2 callq *%rdx

Address: 0x0000000000400fe4

Opcode: ff d2

Instruction: callq *%rdx

Description: This calls the function whose address is stored in rdx.
Since rdx holds a function pointer from the vtable, this is invoking a
virtual method of the XtTraderApi object.

Summary:
A XtTraderApi object is created, and its pointer is stored on the stack.
The vtable pointer of the object is accessed.
A specific virtual method (at offset 0x18 in the vtable) is resolved.
The virtual method is called with the XtTraderApi object (this pointer) as the first argument and 0x407f80 as the second argument.
This is typical C++ behavior for calling a virtual method on an object. The vtable is used to dynamically resolve the correct method to call at runtime.

因此我们确定了 init 函数在虚表中的位置是 0x18 也就是24, 那么24/8 = 3 , 所以是 0,8,16,24 在虚表中是第4个!

但是,但是,我们的虚表显示,ini是第3个函数,也就是位置 16 的那个函数!? windows下也用这个虚表,而且我们其他工程都是虚表(windows与linux)一致的啊!
这是怎么回事!!!??
下面展示部分头文件,大家看看能明白怎么回事吗:

 class XT_API_EXPORT XtTraderApi{public:virtual ~XtTraderApi(){};/*** @brief 获取XtTraderApi实例* @param [in] address XtApiService监听端口*/static XtTraderApi* createXtTraderApi(const char* address);/*** @brief 设置数据回调对象* @param [in] pCallback XtTraderApiCallback类实例*/virtual void setCallback(XtTraderApiCallback* pCallback) = 0;/*** @brief 创建api实例,并进行初始化* @param [in] configFilePath 配置文件夹目录,默认是"../config",运行目录上一层的config下*/virtual bool init(const char* configFilePath = "../config") = 0;

你看, 析构函数,static函数, setCallback, init 但是 那个 static函数不可能写在虚表里啊,windows下就是被撇除的,所以是 析构函数,setCallback, init 这个次序啊。
但是,Linux的反汇编已经说了, init 的位置是 第4个函数!!也就是 static函数 也被算在虚表里了。LINUX 下!
服了,之前其他工程,头文件类声明中的确没有 static函数。。。。。。。
这个在 windows中和Linux中实现是不一样的!!!
所以我们回过头,再去看之前的错误,我们认为我们一直在调用init函数,其实调用的是 setCallback(*pCallback) 函数, 我们以为传入的是字符串,但是api认为你传入的是pCallback, 而且最 搞笑 的是, setCallback 函数会检查 traderApi.ini 是否被加载过,没有则显示的错误和 init 显示的错误一致!
这错误显示太没有逻辑了!直接误导我了几天!!!!!!
于是修改了虚表, all done!

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

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

相关文章

iOS底层原理系列01-iOS系统架构概览-从硬件到应用层

1. 系统层级结构 iOS系统架构采用分层设计模式&#xff0c;自底向上可分为五个主要层级&#xff0c;每层都有其特定的功能职责和技术组件。这种层级化结构不仅使系统更加模块化&#xff0c;同时也提供了清晰的技术抽象和隔离机制。 1.1 Darwin层&#xff1a;XNU内核、BSD、驱动…

日志存储与分析

日志是系统运行的详细记录&#xff0c;包含各种事件发生的主体、时间、位置、内容等关键信息。出于运维可观测、网络安全监控及业务分析等多重需求&#xff0c;企业通常需要将分散的日志采集起来&#xff0c;进行集中存储、查询和分析&#xff0c;以进一步从日志数据里挖掘出有…

Flutter 边框按钮:OutlinedButton 完全手册与设计最佳实践

目录 1. 引言 2. OutlinedButton 的基本用法 3. 主要属性 3.1 核心属性详解 3.2 ButtonStyle 子属性详解 (styleFrom/copyWith) 状态响应优先级说明 4. 自定义按钮样式 4.1 修改边框颜色和文本颜色 4.2 修改按钮形状 4.3 修改按钮大小 4.4 集中演示 5. 结论 相关推…

【Node.js入门笔记4---fs 目录操作】

Node.js入门笔记4 Node.js---fs 目录操作一、目录操作1.fs.mkdir()&#xff1a;创建目录。异步&#xff0c;非阻塞。创建单个目录创建多个目录创建目前之前需要确认是否存在&#xff1a; 2. fs.mkdirSync()&#xff1a;用于创建一个新的目录。异步&#xff0c;非阻塞。3.fs.rmd…

IP风险度自检,互联网的安全“指南针”

IP地址就像我们的网络“身份证”&#xff0c;而IP风险度则是衡量这个“身份证”安全性的重要指标。它关乎着我们的隐私保护、账号安全以及网络体验&#xff0c;今天就让我们一起深入了解一下IP风险度。 什么是IP风险度 IP风险度是指一个IP地址可能暴露用户真实身份或被网络平台…

【软考-架构】5.3、IPv6-网络规划-网络存储-补充考点

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 IPv6网络规划与设计建筑物综合布线系统PDS&#x1f4af;考试真题第一题第二题 磁盘冗余阵列网络存储技术其他考点&#x1f4af;考试真题第一题第二题 IPv6 网络规划与设计…

SVN学习笔记

svn:版本控制软件 解决&#xff1a;1.协作开发 2.远程开发 3.版本回退 服务端软件&#xff1a; VisualSVN http://www.visualsvn.com 客户端软件:Tortoisesvn http://tortoisesvn.net/downloads 1.checkout(检出) 第一查更新数据到本地&#xff0c; 2.update&#xf…

基于asp.net实现的连锁餐厅收银系统[包运行成功+永久免费答疑辅导]

基于ASP.NET实现的连锁餐厅收银系统背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、技术背景 ASP.NET框架的普及与优势&#xff1a; ASP.NET是微软开发的一种用于构建Web应用程序的框架&#xff0c;它基于.NET Framework&#xff0c;提供了丰富的类库和开发工具…

PyTorch 深度学习实战(11):强化学习与深度 Q 网络(DQN)

在之前的文章中&#xff0c;我们介绍了神经网络、卷积神经网络&#xff08;CNN&#xff09;、循环神经网络&#xff08;RNN&#xff09;、Transformer 等多种深度学习模型&#xff0c;并应用于图像分类、文本分类、时间序列预测等任务。本文将介绍强化学习的基本概念&#xff0…

92.HarmonyOS NEXT开发学习路径与最佳实践总结:构建高质量应用

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT开发学习路径与最佳实践总结&#xff1a;构建高质量应用 文章目录 HarmonyOS NEXT开发学习路径与最佳实践总结&#xff1a;构建高质…

HarmonyOS-应用程序框架基础

应用程序框架与应用模型的区别 应用框架可以看做是应用模型的一种实现方式&#xff0c;开发人员可以用应用模型来描述应用程序的结构和行为的描述&#xff0c;然后使用应用程序框架来实现这些描述。 应用模型 应用模型是一个应用程序的模型&#xff0c;它是一种抽象的描述&a…

审批工作流系统xFlow

WorkFlow-审批流程系统 该项目为完全开源免费项目 可用于学习或搭建初始化审批流程系统 希望有用的小伙伴记得点个免费的star gitee仓库地址 仿钉钉飞书工作审批流系统 介绍 前端技术栈: vue3 ts vite arcodesign eslint 后端技术栈:springbootspring mvc mybatis mavenmysq…

本地算力部署大模型详细流程(二)

1、前景回顾 上一篇我们通过ollama本地部署了一个DeepSeek&#xff0c;因为没有前端操作页面&#xff0c;我们只能使用cmd的方式和deepseek对话体验感并不是很好&#xff0c;下面我们通过Docker部署一个前端页面&#xff08;Open WebUI&#xff09; Open WebUI地址&#xff1a;…

django+vue3实现前后端大文件分片下载

效果&#xff1a; 大文件分片下载支持的功能&#xff1a; 展示目标文件信息提高下载速度&#xff1a;通过并发请求多个块&#xff0c;可以更有效地利用网络带宽断点续传&#xff1a;支持暂停后从已下载部分继续&#xff0c;无需重新开始错误恢复&#xff1a;单个块下载失败只…

ICMP、UDP以及IP、ARP报文包的仲裁处理

在之前的章节中&#xff0c;笔者就UDP、ICMP、IP、ARP、MAC层以及巨型帧等做了详细介绍以及代码实现及仿真&#xff0c;从本章节开始&#xff0c;笔者将就各个模块组合在一起&#xff0c;实现UDP协议栈的整体收发&#xff0c;在实现模块的整体组合之前&#xff0c;还需要考虑一…

【NLP 38、实践 ⑩ NER 命名实体识别任务 Bert 实现】

去做具体的事&#xff0c;然后稳稳托举自己 —— 25.3.17 数据文件&#xff1a; 通过网盘分享的文件&#xff1a;Ner命名实体识别任务 链接: https://pan.baidu.com/s/1fUiin2um4PCS5i91V9dJFA?pwdyc6u 提取码: yc6u --来自百度网盘超级会员v3的分享 一、配置文件 config.py …

Linux 蓝牙音频软件栈实现分析

Linux 蓝牙音频软件栈实现分析 蓝牙协议栈简介蓝牙控制器探测BlueZ 插件系统及音频插件蓝牙协议栈简介 蓝牙协议栈是实现蓝牙通信功能的软件架构,它由多个层次组成,每一层负责特定的功能。蓝牙协议栈的设计遵循蓝牙标准 (由蓝牙技术联盟,Bluetooth SIG 定义),支持多种蓝牙…

JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3+ 2025 版免费体验方案

JetBrains&#xff08;全家桶: IDEA、WebStorm、GoLand、PyCharm&#xff09; 2024.3 2025 版免费体验方案 前言 JetBrains IDE 是许多开发者的主力工具&#xff0c;但从 2024.02 版本起&#xff0c;JetBrains 调整了试用政策&#xff0c;新用户不再享有默认的 30 天免费试用…

Prosys OPC UA Gateway:实现 OPC Classic 与 OPC UA 无缝连接

在工业自动化的数字化转型中&#xff0c;设备与系统之间的高效通信至关重要。然而&#xff0c;许多企业仍依赖于基于 COM/DCOM 技术的 OPC 产品&#xff0c;这给与现代化的 OPC UA 架构的集成带来了挑战。 Prosys OPC UA Gateway 正是为解决这一问题而生&#xff0c;它作为一款…

基于银河麒麟系统ARM架构安装达梦数据库并配置主从模式

达梦数据库简要概述 达梦数据库&#xff08;DM Database&#xff09;是一款由武汉达梦公司开发的关系型数据库管理系统&#xff0c;支持多种高可用性和数据同步方案。在主从模式&#xff08;也称为 Master-Slave 或 Primary-Secondary 模式&#xff09;中&#xff0c;主要通过…