无法定位程序输入点steaminternal_findorcreateuserinterface怎么办?

解密失败的原因最长见的就是JDK的版本不匹配,大数据FI系统会在omm用户下安装JDK。如果在安装以前root用户下已经有JDK或者JAVA_HOME环境变量,可能会导致安装FI失败。

根音是由于安装的OS默认的或者当前的共享内存设置不满足GaussDB数据库的对共享内存的要求;故其拒绝安装

遇到此问题,一般是因为python已经被破坏:

执行:whereis python (寻找python新版本的安装路径,并检查此版本是否还在)

可以发现python所在的安装目录已经没有被拼接进PATH,这样自然找不到此指令

双机场景或者单机场景下,系统运行一段时间后,数据库无缘故不在位。GaussDBHA插件无法拉起。期间OSHA都没有重启过

具体看下GaussDB日志多是数据库的目录已经被充满到100%;导致了数据库无法继续工作,主进程退出

A.查看数据库的日志:

su - 数据库安装用户

B. 查看磁盘分区情况: df –h

因为/etc/hosts中的默认配置:127.0.0.1 localhost被人为删除导致了安装时候数据库启动失败,进而OMS安装失败。

该错误一般是由于网卡和主机名不对应导致。

-i命令的IP不一致才会导致is empty的问题。

看一下主机名,然后用ifconfig命令查看对应的网卡ip是否一致,如果不一致修改成一致即可。然后查看/etc/hosts中主机名和ip的对应关系,要保障正确性,重新安装即可。

查看相关资料后发现,是由于修改了/usr的权限,导致sudo出现问题

环境中已经安装了JDK

经多方查阅,并尝试各种办法之后发现,这是因为rpm的数据库被损坏了,解决的办法就是重建数据库。

在重建之前,你需要先删掉以前rpm数据库的相关内容,即/var/lib/rpm目录下的__db.*的几个文件,若一个*.back文件,也需要删除。主要是以下的两条命令完成删除和重建:

安装OMS失败,查看日志后发现是Initdb失败,日志如下:

其他的日志查不出任何错误信息了。

联系cuijiwei后发现,使用如下命令可以将调试日志打印到/home/ommdba中查看:

因为数据库安装设置的编码格式 对方的OS设置不支持,导致的初始化DB失败

echo $LANG 可以查看本机的编码格式,(需要UTF-8才可以,对方是GBK,可能导致一些字符出错)

没有正确配置/etc/hosts导致该问题

这个是由于nodeagent没有起来而造成的。查看后台发现nodeagent进程不在,但是查看start-agent.log脚本启动正常。 继续查看agent.log日志发现,agent没有起来,错误日志如下:

最后定位发现,该节点的/etc/hosts文件配置错误,利用hostname -i 发现没有本机主机名对应的ip

安装集群,第一步骤Verify的时候报错,页面报错信息如下:

1. 页面提示信息指明agent-0.0.1.tar.gz包找不到,但是环境中agent-0.0.1.tar.gz包是存在的,并且权限也正确。可能是互信失败的问题所导致的。

2. 查看后台日志发现果然是sftpAuth fail错误,即互信失败所导致,错误信息如下:

 注:如果上述第3步骤不正确,

4. 但是用omm用户,通过ssh到本机,依旧要输入密码,说明自己与自己互信仍然是失败的。

一. 一般来说,处理这样的问题可以按照如下几个步骤查看:

1. omm用户,ssh到本机,查看是否需要输入密码,如果需要,则可以认为互信失败;

二. 如果手动创建互信oms节点还是互信不了自己的话,有可能是系统的SELINUX未关闭。需要手动关闭系统的SELINUX

2 执行以下命令,禁用selinux

三.确定系统防火墙是否已经关闭。

四. 如果还是不行的话,有可能能是系统的SSH版本,需要修改/etc/ssh/ssh_config

ssh6.7版本以后,对一些加密算法不支持,需要手动在/etc/ssh/ssh_config最后一行添加:

a.首先检查下是否对节点进行了preinstall操作,安装了必要的软件

b.其次如下检查下是否安装有expect这个命令

OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告,避免你受到DNS

日志中显示,好像是scp 这个sbin/download.sh文件时候失败了。我在30上面手动执行scp 这个文件,也是失败的。

这个文件应该内容为空,但是201环境上面的这个文件不为空,所以导致scp失败,清空该文件即可。

该问题在新版本中已经被修复

启动时为Java虚拟机(JVM)分配的内存大于系统可用内存数,所以没有足够的空间分配给JVM来创建Object。(可以看看机器的系统内存目前还剩下多少)

在windbg中,断点设置的地址形式有好多种,可以是以下几种:
Framwork中非常多的使用重载。
可以设置仅在特定条件下被触发的断点。关于这类断点的更多信息,查看设置条件断点。

这是一台微软对外公开的服务器,使用http地址访问,不是所有人都能牢记这个网址,所以最好的办法

就是使用.symfix命令,语法如下:

这个命令等价于上面的.sympath命令,而不用输入长长的http地址。

第一个命令没有任何参数,显示当前设置。后面两个,第二个命令含有“+”代表添加一个选项,第三个

命令含有“-”代表去除一个选项。

关闭C++转换,C++中的::符号将以__显示

如果由于编译器优化导致找不到对应的符号,就以最近的一个符号代替之

使得符号匹配的时候,匹配原则较松散,不那么严格。

忽略镜像文件头中的CV记录

只在已加载模块中搜索符号,如果搜索符号失败,不会自动加载新模块。

不显示文件访问错误对话框。

进行最严格的符号文件检查,只要有微小的差异,符号文件都不会被加载。

允许从内存的一个绝对地址处读取符号信息。

忽视在环境变量中设置的符号路径,也忽视被调试进程的执行路径。也就是说,当搜索符号文件的时候

,不会从这些路径中搜索。

让运行在安腾系统上的调试器,也枚举32位模块。

仅搜索符号文件的公共(PUBLIC)符号表,忽略私有符号表。

不搜索符号文件的公共(PUBLIC)符号表

先搜索pdb文件的私有符号表,如果在其中找到对应的符号,就不再搜索公共(PUBLIC)符号表,这可以

安全模式,让调试器尽量不影响到主机。

不显示符号代理服务器的认证对话框,将导致某些时候无法访问符号服务器

显示符号搜索的详细过程和信息

程序使用托管方法抛出的异常。

(4)其他异常,包括用户程序直接调用RaiseExceptionAPI抛出的异常,以及其它C++编译器抛出的异常

25、对于每个异常,windows都会给两轮处理机会,对于每一轮机会,windows都先将异常交给调试器(

如果存在),然后再寻找异常处理器(VEH,SEH等)处理。每次处理后调试器都应该向系统返回一个处理

结果,说明它是否处理了这个异常。对于二轮机会,如果调试器不处理,则系统采取终极方法:若异常

发生在应用程序中,则立即终止应用程序;若异常发生在内核中,则导致BSOD。用户可自己定制调试器

26、非默认状况下,可以使用“GH”和“GN”来返回与设置的不同状态,前者表示HANDLED,后者表示

27、若要分析程序的入口函数,在初始断点的时候对入口函数设置断点是个合适的时机。

28、创建一个新进程时, 很多早期的创建工作都是在父进程的环境下完成的。初始线程真正在新进程环

29、当将windbg附加到一个进程的时候,windbg在目标进程创建一个新的线程来触发一个初始断点,这

个断点发生在新创建的线程上下文中。因此,这个线程并不是目标的本来线程,当我们恢复执行时,该

30、若远程线程创建后还没有执行断点指令就被挂起了,这时候WINDBG收不到断点事件,会提

31、单步执行根据当前是否处于源代码模式(Source Mode)分为源代码级的单步和汇编指令级的单步,

选中Debug菜单的Source Code菜单项(或者使用命令“1+t”)进入源代码模式, 反选(或者使用命令

“1-t”)进入汇编模式。

32、单步越过的命令是通过在下一条指令处设置一个软件断点来实现的,而源代码级的单步执行是通过

多次汇编级的单步执行来实现的。(可查看相关的函数调用及参数说明来观察到)

其中,r的用处是禁止自动显示寄存器的内容,在使用[= StartAddress]命令参数时需要注意若指定的地

址在函数外部,由于跳过了调整栈的代码,会发生栈错误。Count表示单步执行几次,Command表示在每

次单步执行后需要执行的指令。

单步执行到指定地址,显示每一次命令执行后的结果。例如:使用伪寄存器$ra(return address),命令

“par @$ra *其效果相当于gu(执行至上一层函数)”。

一个函数调用处(call命令)为止,count代表执行到第几个call指令处,缺省为1。

一个分支指令处为止,X86平台上该命令只能用于内核态调试。(与pc|tc这样反复单步执行的指令不同

,该命令是设置好msr(mode status register)寄存器和标准寄存器后恢复程序执行,因此更高效)

a代表将断点设置为硬件断点,不指定则为软件断点BreakAddress用来指定一个隐藏的断点地址,当执行

Cursor便是用该命令实现的)。

38、在函数入口处,命令“wt”用来了解一个函数的执行路径和它调用了哪些函数,每个函数又有多少

条指令。(若不在函数入口处,则其执行效果相当于“p”)

39、单步执行和g指令导致的程序指针飞跃在一定条件下有比较大的用处:如我们不想执行某个函数或者

跳过导致异常的某段代码。但如果跳过了涉及栈操作的代码,会引发栈的不平衡,导致程序发生错误。

其中/1表示设置当击中该断点时自动将其从断点列表中删除(即设置为一次击中断点),/c|C分别指定

中断给用户的最大(小)函数深度。/p和/t只能用于内核调试中,后面分别跟一个EPROCESS和ETHREAD结

构,用来表示只有在指定的进程(线程)中才能访问该断点。

bu用来设置一个延迟的以后再求解的断点,用于对尚未加载模块中的代码设置断点,所以bu命令对调试

动态加载的模块的入口函数或者初始化代码特别有用。如:“bu Driver!DriverEntry”

41、bm命令在设置断点前需要确认匹配的符号对应的是代码不是数据,所以使用bm命令时要求目标模块

的调试符号有类型信息,能够判断出一个符号的类型。这通常需要所谓的私有符号文件,也就是调试版

本的符号文件。对于公用的符号文件,如我们输入“x ntdll!DbgPrint*”会显示WinDbg抱怨没有符号类

型信息,再输入“bm ntdll!DbgPrint*”时显示没有找到匹配的代码符号,类似解决办法有两个:

(1)开启/a开关告诉调试器无论是数据还是代码都要设置断点,在不确定所有符号均为代码时这样做会

(2)使用调试器告诉你的方法:用dll内部的export symbols,具体做法是将该符号文件路径清空(清

symbols,发现WinDbg不再抱怨没有符号类型信息(尽管还是缺参数信息)。当再次输入“bm ntdll!

DbgPrint*”发现批断点设置成功。

断点就是通过CPU的硬件寄存器(x86中为dr0~dr7(不包含4、5),最多同时4个硬件断点,dr6为断点的

状态寄存器,dr7为断点的控制寄存器)设置的断点,硬件断点具有数量限制,但是可以使用软件断点不

具有的功能,比如监视数据访问和I/O访问等。(这点比较重要)

Options中指定了触发断点的条件,具体参数参考手册。另外,AccessSize参数用来指定访问的长度,对

于访问代码硬件断点,它的值应该为1。

43、当我们只关心特定条件的断定命中的时候,可以使用条件断点简化调试过程。其运作原理是当断点

发生时,让调试器检查一个条件,对于不满足条件的情况,立刻恢复目标执行,只有满足条件了才中断

常见的编写条件断点的方式有两种:

该命令对dbgee程序的wmain函数设置一个断点,只有当命令行的参数的个数大于1时,执行'dd argc l1; 

(poi(argv+4)表示显示第一个命令行参数的字符串内容)

,在MASM的语法中,argc代表一个地址,要取它的值必须使用poi操作符,poi表示从地址中取出指针长度

可以使用该命令将MASM表达式评估器变为C++评估器:

“.expr /s c++”,此时以上的命令可以表述为:

WinDbg版本不一定支持该功能----可能存在bug),如果当前是MASM表达式评估器,可以使用@@前导符来

嵌入C++表达式,如:

号里的内容使用C++评估器)

44、断点命令的地址(Address参数)的设置有如下几种方法:

(2)直接使用内存地址,如“bp ”

(3)若使用的是完全的调试符号,调试符号内包含源文件的行信息,可以使用该形式设置地址:`

(4)对于C++的类方法,可以使用__或者::连接类名称和类方法,如:“bp 

注:若使用方法(1)或(2),要注意设置的地址必须是一个指令的起始位置。如果插入在指令的中间

位置,CPU会将中间字节替换为中断指令,当CPU执行到这个位置时,CPU会因为这里是一条多字节的指令

将原指令的前一部分和断点指令作为一个新的指令来解码,会引发严重的错误。

45、设置针对线程的断点:

(2)内核程序,使用上面介绍的/p /t 选项来指定进程和线程。

46、bl命令列出所有断点:第一列表示断点编号,第二列表示断点状态,e为enable,d为disable,e或d

后面可能跟u,表示尚未落实unresolved,第三列为断点地址,表示方法有多种,若针对硬件断点,地址

后有访问方式和访问长度,第四列表示还需多少次击中目标才中断给用户,括号内为总共需要击中目标

的次数(即设置断点参数时Passes的值),第五列表示进程和线程信息,其中****表示对所有线程均设

置该断点,第六列表示断点地址的符号表示。如果断点有相关的命令,则显示在第六列之后。当设置

可以使用bc(cancle), bd, be后跟断点编号分别删除、禁止、启用断点。例如“bd 0-2,4”“be *”

分别表示禁止0、1、2、4号断点,启用所有断点。

br(remark)改变断点编号,例如当删除3号断点后,“br 4,3”将4号断点变为3号断点。

47、使用k系列命令观察栈回溯,其中第一列的ChildEbp表示该行函数的ebp(帧指针)的值,调用函数位

置是通过寻找距离该行的RetAddress最近的符号获得。k系列命令后可跟L(注意大写)来隐藏在源文件

48、kb命令可以只显示该函数的前三个参数,第一个是ebp+8,依次类推。注:说是函数的前三个参数,

其实是不准确的,这三个数只是存放在栈上的数,不一定是函数参数,如对于调用惯例为fastcall(函

数参数通过寄存器传递)的函数。这是我们可以使用kp命令让调试器根据符号文件的信息帮我们进行判

断,但此时只能是使用私有符号文件才可以这么做,没有符号文件的情况下,kp不显示任何参数,这就

是为什么通常使用kb命令的原因。

kv命令可以显示FPO(帧指针省略信息)和调用惯例。

kn命令可以显示帧栈的编号,若再加上f选项可以查看相邻栈帧的间距(上下相邻的ebp的差值),该数

值越大,说明该函数使用的栈空间越大。

49、查看栈帧空间参数和变量:

内存地址,而V附加显示了该变量对于ebp的偏移地址。

于枚举当前线程的所有帧栈后面可跟附加命令,如附加“dv /i /t /V”查看所有帧栈的变量及参数信息

注:(1)dv命令只能对加载了私有符号文件的模块使用,若没有加载私有符号,可以使用如下方法查看

局部变量。一、直接使用内存观察窗口观察帧栈空间,利用栈帧分布的知识。二、通过使用汇编指令中

对局部变量的引用来观察该内存地址的内容,对于没有使用FPO的函数,局部变量一般都是在EBP XXXX的

(2)对于VC7或更高的版本,局部变量是从EBP-CH开始的,EBP-4用来存放安全Cookie值,EBP-8存放安全

50、当EBP和ESP的值已经不可信时,此时无法使用k系列命令来查看栈回溯,应该通过配合使用“!teb”

(得到栈的内存位置)和“dds <AddressScope>”(显示和分析栈内存)来手动分析栈回溯(通过排除

不是函数的字符串行)。

“dy{b|d}”(以二进制显示字节和双字)

“da|u”(分别显示单(宽)字符集的字符串)

显示范围有以下两种表示方法:

(1)起始地址加空格加终止地址

(2)起始地址加空格加L(或者l)和对象个数

(3)终止地址加空格加L(或者l)加负号加对象个数

(1)对象个数为数据单位,直接执行d命令保持上次执行查询内存的命令。

(2)对于数据结构类型的字符串,可以通过命令“ds|S”分别显示STRING和UNICODE_STRING数据类型的

”显示ntdll里的所有类型信息。其中,-b开关指定递归的显示所有子类型的信息。-r加数字指定递归显

示的深度,如-r0表示不显示子类型信息。若不想显示全部字段,可以使用开关-ny附加字段过滤搜索信

(2)第二种用法是在上一种用法之后加上内存地址,按照指定的内存地址的内容来显示具体类型的变量

(3)第三种用法是显示类型的实例,如全局变量、静态变量和函数。同样可以枚举函数符号,此时同x

命令的功能相似,如“dt dbgee!*wmain*”,若是指定的函数,则会显示该函数的参数取值和返回值类

53、可以使用如下方法搜索内存内容:

(2)“s-[[Flags]]v Range Object”,在指定内存地址范围内与指定对象相同类型的对象。

a、u,Pattern参数用来指定要搜索的内容,可以用空格分隔依次搜索的数值,如:

(其中l后面跟数字表示在起始地址之后多少范围内进行搜索)

数值。若不键入Value,则会进入交互式的修改内存界面。

的特征信息。只有在内核调试时才能使用该命令。

57、使用.call元命令在当前进程中调用一个函数。Windbg在当前线程栈上模拟出函数调用的环境,将参

数、返回地址和寄存器等准备好,然后恢复目标执行,恢复目标执行后便执行要调用的函数。但要求必

须有私有调试符号文件支持。

57、可以编写命令程序作为WinDbg的输入,进行预调试。

补充一个DV,用于查看本地变量用的
9 e命令可以用来修改内存地址
跟d命令一样,e命令后面也可以跟类型后缀,比如ed命
令表示用DWORD的方式修改。下面的命令把054efc14地址上的值修改为。
修改后可以用dd命令来查看内存。
0:018>dd L4参数指定内存区间的长度为4个DWORD,这样输出只有1行,
10s 命令用来搜索内存具体见help文档
上面输出的第一列是线程的编号和线程ID,后一列对应的是该线程在用户态模式中的
在该命令加上f参数,还可以看到内核态的繁忙时间,当进程内存占用率比较高的时候
,通过该命令可以方便的找到对应的繁忙线程。
12 ~ 命令是用来切换目标线程
0:018> ~0s把当前的线程切换到0号线程,也就是主线程,切换后提示符会变为0:000.
13 ~* 命令列出当前进程中的所有线程的详细信息
14~*kb命令列出所有线程的堆栈
15 k 命令用来显示当前线程的堆栈,如下
跟d命令一样,k后面也可以跟很多后缀,比如kb kp,kn,kv,kl等,这些后缀控制了
这四条指令显示的内容类似,但是每个指令都有特色,KB显示三个参数,Kp显示所有的参数,但需要

二进制数据,第三列是二进制对应的符号。上面的命令自动找到了75ecb390f对应的符号是BROWSEUI!

。比如,我们用$exentry表示进程的入口,那么可以用bp @$exentry在进程的入口设置断点,如果

存地址,而不是符号的数值,相当于c语言的&操作符的作用,poi命令就是取这个地址上的值,相当于c

语言的*操作符。所以这个条件判断的意思就是判断exceptioninject!i的值,是否小于十进制的40。如

由于这个printf命令本身是在ba命令的双引号里面,所以需要用//来转义print中的引号。第一个引号的

第二个引号的作用就是显示stop,由于后面没有g命令,所以windbg会停下。
22 bm 使用模式匹配设置断点
这个功能需要符号表的支持,bm可以通过模式一次设置多个断点,比如

就是对于内存访问设置断点,对于在多核处理或者多核处理器调试的时候很有用,对于调试多线程也很

有用,比如说,我们可以对一个全局变量设置断点,

,你可以很快找到是谁修改的。

击中并且表达式成立时要执行的指令;gc指定是从一个条件断点返回,是不可少的一部分。
T指令单步执行,在源码调试状态下,可指源码的一行,根据不同的选项也可以为一行ASM指令;
TA单步跟踪到指定地址,如果没有参数将运行到断点处。
P,PA,PC相信不用多做解释,大家也都明白了
.指令打一个源文件,可以打开一个全路径的文件,也可以通过函数地址来打开并定位到源文件中函数的

用全路径,如果源路径已经设置,也可以直接指定源文件名称。如lsf mydriver.c,lsf 

命令看到的信息和状态就是dump文件保存时进程的状态。通过dump文件能够方便的保存发生问题时进程

的状态,方便事后分析。

条件断点(condition breakpoint)的是指在上面3种基本断点停下来后,执行一些自定义的判断。
  在基本断点命令后加上自定义调试命令,可以让调试器在断点触发停下来后,执行调试器命令。每个

令poi的作用是取这个地址上的值,相当于C语言中的*操作符.因此这里取得MyVar的值.
伪寄存器,帮助保存调试的中间信息
考虑这样的情况,如果要记录某一个函数被执行了多少次,应该怎么做?简单的做法就是修改代码,在

这里用到的$t0就是Windbg提供的伪寄存器。可以用来存储中间信息。这里用它来存储函数执行的次数。

r命令可以用来查看,修改寄存器(CPU寄存器和Windbg的伪寄存器都有效)的值。随便挑一个繁忙的进

我要回帖

更多关于 internal用法 的文章

 

随机推荐