Teamcenter 在 suse linux上调试
时间:2021-12
作者:李云
事由:近期某项目上的ITK程序,在虚拟机Windows环境下通过了测试,但在客户Linux测试环境下却崩溃了,故不得不寻找一个在Linux下调试ITK程序的方法,特记以此文。
环境:SUSE Linux Server 12 + Teamcenter 13.1 + GCC 4.8.5 + GDB 8.0.1
经过:
- 将写好的ITK程序复制到SUSE Linux系统中,使用make命令进行编译:
a) 必须使用合适的Linux用户来进行编译,否则编译完成后的文件,可能需要修改用户权限。这里使用的是Teamcenter软件专用的infodba用户;
b) 需要切换到makefile所在目录下执行make命令,否则可能会提示没有makefile文件,或者需要手动指定makefile全路径;
当前使用的makefile文件中,编译选项必须含有-g,否则编译好的.so文件中将不包含调试信息:
-
当前使用的makefile文件内容:
-
SITE = libZL13
TC_ROOT = /usr/Siemens/Teamcenter13
DEBUG = -g
USER_INCLUDE = -I.
USER_LIB =
CC = gcc
LD = gcc
SRCS = $(wildcard *.c)
OBJS = $(patsubst %c, %o, $(SRCS))
DEFINES=-c -fPIC -m64 -DPOSIX -DIPLIB -DNO_DOT_H -DSITE=${SITE}
# -I指定头文件目录
INCLUDES = ${USER_INCLUDE} -I${TC_ROOT}/include -I${TC_ROOT}/include_cpp
# -L指定库文件目录,-l指定静态库名字(去掉文件名中的lib前缀和.a后缀)
LIBS = ${USER_LIB} -L${TC_ROOT}/lib -ltc
CFLAGS = ${DEFINES} ${INCLUDES} ${DEBUG} -c
TARGET = ${SITE}.so
.PHONY:all clean
all: $(TARGET)
# 链接时候指定库文件目录及库文件名
$(TARGET): $(OBJS)
$(LD) -shared -o $@ $^ $(LIBS)
# 编译时候指定头文件目录
%.o:%.c
$(CC) $(CFLAGS) $^
clean:
rm -f $(OBJS) $(TARGET)
- 将编译好的.so文件复制到ITK程序所在目录:
-
a) 此处直接使用命令进行复制:
sudo cp ./libZL13.so /usr/Siemens/Teamcenter13/lib/- 使用ps命令查看系统中的tcserver进程,记住当前的列表:
-
-
a) 命令:
ps -ef|grep tcserver- 启动Teamcenter胖客户端,并登录:、
- 登录完成后,再次使用ps命令查看tcserver进程,找到新增的线程ID:
- 启动GDB工具(由于SUSE默认安全要求,这里必须用sudo,否则可能会没有操作权限),附加到新增的tcserver进程(此处进程ID为9097):
-
a) 命令:
sudo gdb libZL13.so 9097b) 也可以先直接使用命令sudo gdb进入gdb调试环境,然后再使用gdb内部的命令attach 9097附加到9097进程(如果碰到不能打断点的问题,可以使用这种方法)
- 尝试列出需要调试的ITK函数,用以验证调试信息是否正常加载:
-
a) GDB命令:
list cust_check_property_by_value - 设置断点,这里设置为一进入函数就中断:
a) GDB命令:
break cust_check_property_by_valueb) GDB命令:
continue- 流程准备:在流程中加入handler,然后启动流程:
- 当命中断点时,gdb中会给出提示(如果没有提示,胖客户端也卡住了,尝试在gdb中使用continue命令):
常用gdb命令(在提示符下直接敲回车表示重复上一条命令):
-
backtrace(或bt) 查看各级函数调用及参数
finish 连续运行到当前函数返回为止,然后停下来等待命令
frame(或f) 帧编号 选择栈帧
info(或i) locals 查看当前栈帧局部变量的值
list(或l) 列出源代码,接着上次位置往下列,每次列10行
list 行号 列出从第几行开始的源代码
list 函数名 列出某个函数的源代码
next(或n) 执行下一行语句
print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数
quit(或q) 退出gdb调试环境
set var 修改变量的值
start 开始执行程序,停在main函数第一行语句前面等待命令
step(或s) 执行下一行语句,若有函数调用则进入函数中
break(或b) 行号 在某一行设置断点
break 函数名 在某个函数开头设置断点
break ... if ... 设置条件断点
continue(或c) 从当前位置开始连续运行程序
delete breakpoints 断点号 删除断点
display 变量名 跟踪查看某个变量,每次停下来都显示它的值
disable breakpoints 断点号 禁用断点
enable 断点号 启用断点
info(或i) breakpoints 查看当前设置了哪些断点
run(或r) 从头开始连续运行程序
undisplay 跟踪显示号 取消跟踪显示
- 启动Teamcenter胖客户端,并登录:、
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章