【C++软件异常问题分析】不同版本的库混用导致步调启动异常 | Telnet不上服 ...

打印 上一主题 下一主题

主题 1002|帖子 1002|积分 3016

目录
1、概述
2、相互依赖的库版本不同等导致步调启动失败问题
2.1、将逐日开辟版本的库覆盖到封闭稳固版本的软件目录中,出现库与库版本不同等的问题
2.2、Debug库与Release库混用导致步调启动失败
2.3、32位库与64位模块混用会导致步调启动时报0xc000007b错误
3、Telnet不上软件中内置的Telnet服务问题
4、最后

C++软件异常排查从入门到精通系列教程(核心佳构专栏,欢迎订阅,连续更新...)
https://blog.csdn.net/chenlycly/article/details/125529931C/C++实战专栏(重点专栏,专栏文章已更新到480多篇,连续更新中...)
https://blog.csdn.net/chenlycly/article/details/140824370VC++常用功能开辟汇总(专栏文章列表,欢迎订阅,连续更新...)
https://blog.csdn.net/chenlycly/article/details/124272585Windows C++ 软件开辟从入门到精通(专栏文章,连续更新中...)
https://blog.csdn.net/chenlycly/category_12695902.htmlC++软件分析工具从入门到精通案例集锦(专栏文章,连续更新中...)
https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,连续更新中...)
https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,连续更新中...)
https://blog.csdn.net/chenlycly/category_2276111.html       本日同事那边使用我们的软件时接连遇到两个问题,固然问题不难排查,但有肯定的代表性,所以将这两个问题的排查过程分享出来,以供各人鉴戒或参考。
1、概述


       音视频开辟组的同事在使用我们的软件时,在将他们的dll库替换到软件的安装目录中后,软件出现了无法启动的问题,于是找我去分析排查一下。这个问题办理后,又冒出了一个新的问题,无法telnet到软件中内置的telnet服务端口上,于是又进行了一通分析排查。这两个问题不难排查,但有肯定的代表性,所以本日将这两个问题的排查过程分享出来,供各人鉴戒或参考。
2、相互依赖的库版本不同等导致步调启动失败问题

       我们的软件包含了音视频模块(软件的核心模块),近来音视频模块出现了问题,负责维护这些模块的音视频开辟组同事为了排查问题,须要在我们的软件中调试(附加到进程调试)这些音视频模块动态库。于是使用安装包安装了release版本的软件,然后将他本地编译的音视频dll模块覆盖到软件的安装目录中(将安装包中自带的音视频模块替换掉),准备先启动软件,然后再将打开这个模块工程的Visual Studio附加到软件进程上调试代码。结果双击运行软件时,软件始终起不来,于是找到我帮忙排查一下,看看怎么回事。
       在其他呆板上安装了当前版本的软件,软件是可以正常启动的,基本说明当前版本的软件应该是没问题的。那在他呆板上出现问题,估计是与他手动覆盖库有关系,估计是覆盖库之后出现了库与库的版本不同等导致步调启动失败。于是按照这个思路进行了摸排。
2.1、将逐日开辟版本的库覆盖到封闭稳固版本的软件目录中,出现库与库版本不同等的问题


       我们给的软件版本是封闭的稳固版本,是不是音视频开辟组的同事本地编译的是逐日开辟流的代码,即覆盖到软件安装目录中的音视频库是逐日开辟版本的,逐日开辟版本的dll库大概率会和封闭稳固版本的dll库不匹配的,由于不匹配,所以软件启动时出现了异常闪退,进而软件启动失败。
       经确认,同事当前编译简直实是逐日开辟流的版本,所以和当前封闭稳固版本的版本不匹配,于是让他们使用与软件安装包同等的封闭稳固版本试试看。
2.2、Debug库与Release库混用导致步调启动失败

       同事编译了封闭稳固版本流的代码,编译出来后手动将dll库覆盖到软件安装目录中,但软件照旧启动不起来。

        是不是编译的Debug版本的库呢?我们的软件安装包对应的是Release版本,如果当前编译替换的是Debug版本的库,则也会出现Debug版本库与Release版本库混用的问题。由于Debug版本库与Release版本库的内存分配与管理机制是不同的,比如在Debug下申请内存时系统给其分配的现实内存大小可能要比申请的大小要大一些的,用来存放一些调试信息大概桩信息,还记得我们之前讲的Debug下默认打开的/RTC运行时检测编译选项吗?不记得的朋侪可以去查看我的文章:
【Stack around the variable ‘xxx‘ was corrupted】被调函数中发生栈内存越界,越界到主调函数栈内存上,导致内存被篡改的典范案例分析
https://blog.csdn.net/chenlycly/article/details/143102512
   一般严酷禁止将Debug库与Release库混在一起使用的,可能会出现不可预料的问题。比如一个在Debug库中动态申请的内存,到外部的Release库中去开释,则可能会出问题,由于两种机制下分配的内存长度是不一样的。
          经确认,同事确实拷贝的Debug版本的库到我们软件的安装目录中覆盖的,所以就是Debug版本库与Release版本库混用导致的。于是同事编译Release版本的库,覆盖到软件的安装目录中,软件就可以正常运行起来了。
2.3、32位库与64位模块混用会导致步调启动时报0xc000007b错误

       库与库之间的不匹配,除了上面讲的库版本不同等以及Debug库与Release库混用问题之外,还有一种情况,就是32位库与64位模块混用导致不匹配。32位模块与64位模块的地址寻址范围是不同的,32位模块是按32位寻址,64位模块是按64位寻址的,混在一起使用是有问题的,在主步调启动时会报0xc000007b的错误,如下所示:

一旦报这个0xc000007b错误,一般都是相互依赖的模块的位数不同等引起的,即一个是32位的,一个是64位的
       这个0xc000007b错误码对应的详细含义为:

即0xC000007B值对应的宏为STATUS_INVALID_IMAGE_FORMAT,无效的二进制文件格式,可能是二进制文件的版本与操作系统不同等(比如64位步调不能运行在32位系统上);也可能是二进制文件中包含错误(比如二进制文件内容破坏大概被篡改);也可能是有依赖关系的32位二进制文件与64位二进制文件混用引发的(32位和64位模块不能混在一起使用,必须位数同一)!
       那怎样才能查看到二进制文件的位数呢?可以使用PEViewer、EXE Explorer大概Visual Studio自带的dumpbin.exe工具去查看二进制文件的位数,相干方法可以查看我之前写的文章:
使用Dumpbin工具查看C++二进制文件的位数、时间戳及dll库的依赖关系
https://blog.csdn.net/chenlycly/article/details/140153214 怎样查看exe和dll等二进制文件的生成时间(时间戳)和位数(32位/64位)
https://blog.csdn.net/chenlycly/article/details/140043291       关于由于模块位数不同等导致步调无法启动报0xc000007b错误的实战排查案例及相干细节点的详细说明,可以查看我的文章:
C++步调无法正常启动(报0xc000007b错误)问题的详细排查
https://blog.csdn.net/chenlycly/article/details/126298265       关于dll库加载失败可能原因的详细总结,可以查看我之前写的文章:
【C++动态库】DLL动态库加载失败导致步调启动报错以及DLL库加载失败的常见原因分析与总结
https://blog.csdn.net/chenlycly/article/details/142714236

       在这里,给各人重点推荐一下我的几个热门脱销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)
专栏1:该佳构技术专栏的订阅量已达到570多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章连续更新中,预计更新到200篇以上!欢迎订阅!)
C++软件调试与异常排查从入门到精通系列文章汇总
https://blog.csdn.net/chenlycly/article/details/125529931
   本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细报告了C++软件的调试方法与手段,以图文并茂的方式给出详细的项目问题实战分析实例(很有实战参考价值),带领各人逐步掌握C++软件调试与异常排查的相干技术,适合基础进阶和想做技术提升的相干C++开辟人员!
  观察一个开辟人员的水平,一是看其编码及设计本领,二是要看其软件调试本领!所以软件调试本领(排查软件异常的本领)很重要,必须器重起来!能办理一般人办理不了的问题,既能提升个人本领及价值,也能表现对团队及公司的贡献!
  专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在连续更新中,预计文章篇数能更新到200篇以上!
  专栏2:(本专栏涵盖了C++多方面的内容,是当前重点打造的专栏,订阅量已达220多个,专栏文章已经更新到480多篇,连续更新中...)
C/C++实战进阶(专栏文章,连续更新中...)
https://blog.csdn.net/chenlycly/category_11931267.html
   以多年的开辟实战为基础,总结并解说一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相干知识点进行详细地睁开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、数据布局与算法、C++11及以上新特性(不但看开源代码会用到,日常编码中也会用到部门新特性,面试时也会涉及到)、常用C++开源库的先容与使用、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(排查软件异常的手段与方法、分析C++软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等)、设计模式、网络基础知识与网络问题分析进阶内容等。
  专栏3:  
C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,连续更新中...)
https://blog.csdn.net/chenlycly/article/details/131405795
   常用的C++软件辅助分析工具有SPY++、PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细先容怎样使用这些工具去奇妙地分析息争决日常工作中遇到的问题,很有实战参考价值!
  专栏4:   
VC++常用功能开辟汇总(专栏文章,连续更新中...)
https://blog.csdn.net/chenlycly/article/details/124272585
   将10多年C++开辟实践中常用的功能,以高质量的代码显现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地办理软件开辟过程中遇到的问题。
  专栏5: 
C++ 软件开辟从入门到精通(专栏文章,连续更新中...)
https://blog.csdn.net/chenlycly/category_12695902.html
   根据多年C++软件开辟实践,详细地总结了C/C++软件开辟相干技术实现细节,分享了大量的实战案例,很有实战参考价值。
  
3、Telnet不上软件中内置的Telnet服务问题

       上述软件启动不了的问题办理了,软件可以正常启动起来了,结果又出现了新的问题。我们软件中内置了Telnet服务模块,可以用系统自带的Telnet客户端连接到软件中内置的Telnet服务模块查看运行日志并输入控制命令。但软件启动后始终连不上软件中的Telnet服务。
       软件中内置的Telnet服务在本机上会绑定一个监听端口,默认从2500开始绑定,如果端口已被占用,则将端标语自动向上累加,再去绑定累加后的端口,直到绑定乐成为止。
       同事用Telnet命令去连默认端口2500,结果表现连不上:

有可能2500端口已被其他步调占用,软件中内置的Telnet服务模块会自动累加端标语去绑定,于是接连实行了2501、2502等十几个向上累加的端口,但照旧Telnet不上。
      于是想到去查看当前系统占用的全部端口信息,看看软件中的Telnet服务模块到底绑定的是哪个端口。可以在cmd窗口中实行netstat /o命令查看全部的端口信息(/o参数是用来表现占用端口的进程id),表现的信息中会包含所属的进程id:

我们先到系统的任务管理器中查看我们软件的进程id,然后通过这个id到netstat /o命令查看我们软件占用了哪些端口,其中一个靠近默认的2500的端口应该就是Telnet服务端口。使用netstat /o命令查看不方便,也不直观,于是使用TCPView工具查看。
       看到我们软件绑定了一个靠近默认端口2500的端口2662,该端口处于监听(listen)状态:

于是用telnet命令连接2662端口,确实是能连上了。
   照旧用工具查看信息比力直观直接,在日常开辟维护工作中,要只管把一些常用的工具用起来。常用的工具有SPY++、Dependency Walker、剪切板查看工具Clipbrd、 GDI对象查看工具GDIView、Process Explorer、Process Monitor、API Monitor、调试分析工具Windbg、交互式反汇编工具IDA、抓包工具Wireshark等,关于这些工具的先容与使用以及相干实战问题排查实例,可以查看我之前写的文章:
  C++开辟值得推荐的十大高效软件分析工具
https://blog.csdn.net/chenlycly/article/details/139723314C++ 常用软件分析工具及项目实战问题分析案例集锦
https://blog.csdn.net/chenlycly/article/details/139723006
         同事这个电脑着实有点奇怪,居然从2500开始有100多个端口都绑定失败,导致终极绑定在2662端口上。这种情况很少遇到,一般从2500开始累加几个,就能绑定上的。
4、最后

       这是本日同事那边接连遇到的两个问题,固然问题不难排查,但有肯定的代表性,所以将这两个问题的排查过程分享出来,以供各人参考。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表