如何用Eclipse调试JBoss AS 7和WildFly8容器自身

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Eclipse调试JBoss AS 7和WildFly8容器自身相关的知识,希望对你有一定的参考价值。

用Eclipse调试JBoss AS 7方法步骤:
1、修改JBoss启动配置
打开JBOSS_HOME/bin目录下的run.conf文件,找到:
#JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y"
将其修改为:
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"
其中:8787为调试的端口号;
2、启动JBoss
./run.sh -b192.168.1.x
其中192.168.1.x是Jboss所在机器的ip;
3、新建调试配置
在Eclipse中,打开菜单“run”-〉“debug...”;在出现的对话框中,选择“Remote Java Application”,右键单击,在弹出的菜单中选择“New”,在出现的对话框的“host”中输入Jboss服务器的ip(192.168.1.x),在“port”中输入调试的端口号(8787),选择“debug”开始调试;
4、调试
在出现的“debug view”中,打开需要调试的Java源文件,设置相应的断点就可以了;
参考技术A 1. WildFly8启动参数研究
我们在Linux操作系统下,启动WildFly8,然后查看其进程信息。

1.1 启动 WildFly8
我们用下面绿色命令启动WildFly8:
-bash-4.1$ ./standalone.sh
=========================================================================

JBoss Bootstrap Environment

JBOSS_HOME: /home/ems/jboss/wildfly-8.0.0.CR1

JAVA: /usr/java/jdk1.7.0_13/bin/java

JAVA_OPTS: -server -XX:+UseCompressedOops -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true

=========================================================================

15:35:02,533 INFO [org.jboss.modules] (main) JBoss Modules version 1.3.0.Final
15:35:03,399 INFO [org.jboss.msc] (main) JBoss MSC version 1.2.0.CR1
...

1.2 查看WildFly8进程信息
我们用下面绿色命令查看WildFly8进程信息:

-bash-4.1$ ps -ef|grep java
ems 19350 19296 45 15:35 pts/1 00:00:08 /usr/java/jdk1.7.0_13/bin/java -D[Standalone] -server -XX:+UseCompressedOops -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dorg.jboss.boot.log.file=/home/ems/jboss/wildfly-8.0.0.CR1/standalone/log/server.log -Dlogging.configuration=file:/home/ems/jboss/wildfly-8.0.0.CR1/standalone/configuration/logging.properties -jar /home/ems/jboss/wildfly-8.0.0.CR1/jboss-modules.jar -mp /home/ems/jboss/wildfly-8.0.0.CR1/modules org.jboss.as.standalone -Djboss.home.dir=/home/ems/jboss/wildfly-8.0.0.CR1 -Djboss.server.base.dir=/home/ems/jboss/wildfly-8.0.0.CR1/standalone
ems 19460 19435 0 15:35 pts/2 00:00:00 grep java

1.3 WildFly8进程信息分析
根据1.2的结果,我们可以看到 该命令可以大致分为以下几段:
java $VM_ARGUMENTS -jar /home/ems/jboss/wildfly-8.0.0.CR1/jboss-modules.jar $PROGRAM_ARGUMENTS

$VM_ARGUMENTS:虚拟机参数:
-D[Standalone] -server -XX:+UseCompressedOops -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dorg.jboss.boot.log.file=/home/ems/jboss/wildfly-8.0.0.CR1/standalone/log/server.log -Dlogging.configuration=file:/home/ems/jboss/wildfly-8.0.0.CR1/standalone/configuration/logging.properties

$PROGRAM_ARGUMENTS:程序参数:
-mp /home/ems/jboss/wildfly-8.0.0.CR1/modules org.jboss.as.standalone -Djboss.home.dir=/home/ems/jboss/wildfly-8.0.0.CR1 -Djboss.server.base.dir=/home/ems/jboss/wildfly-8.0.0.CR1/standalone简而言之,就是利用 java 虚拟机运行 /home/ems/jboss/wildfly-8.0.0.CR1/jboss-modules.jar。
java运行jar包,本质是运行这个jar包中 META-IN/MANIFEST-MF 文件所定义的Main-Class:
Main-Class: org.jboss.modules.Main

到这里,读者是否已经知道如何用Eclipse调试WildFly8了呢?

2. 用Eclipse调试WildFly8
根据我们在上面的研究,我们执行如下步骤来调试WildFly8。

2.1 创建"Debug Configurations"
点击Eclipse工具条上的 调试按钮(图标是一只虫子)边上的向下的箭头,这将显示一个下拉列表。
下拉列表中,选择"Debug Configurations..."项,这将打开"Debug Configurations"窗口。

在 "Debug Configurations"窗口的左侧,右键选中"Java Application",然后点击弹出菜单中的“New”,这将创建一个“New_Configuration”。

选中这个“New_Configuration”,右侧就会显示它的一些初始配置。我们下面对它进行一些修改。
2.2 配置新建的"Debug Configurations"
2.2.1 Main标签页
Name:改成你期望的名字,比如:"wildfly8_debug" / “wildfly8-CR1_debug”
Main Class:输入org.jboss.modules.Main

2.2.2 Arguments标签页
Program arguments:将上面的 $PROGRAM_ARGUMENTS 指代的内容拷贝进来。
VM arguments:将上面的 $VM_ARGUMENTS 指代的内容拷贝进来。

2.2.3 Classpath标签页
选中"Bootstrap Entries"或者"User Entries"
点击右侧的“Add External JARs...”
在弹出的"Jar Selection"窗口中,选择 /home/ems/jboss/wildfly-8.0.0.CR1/jboss-modules.jar。

2.2.4 应用上述修改
点击"Debug Configurations"窗口底部的"Apply"按钮,应用上述修改。

2.3 启动"Debug Configurations"
点击"Debug Configurations"窗口底部的"Debug"按钮,我们就可以看到,Eclipse就开始调试 wildfly8 了。本回答被提问者采纳

如何用python调试死锁?

【中文标题】如何用python调试死锁?【英文标题】:How to debug deadlock with python? 【发布时间】:2009-02-09 06:49:07 【问题描述】:

我正在开发一个多线程应用程序,这是死锁。

我正在使用 Visual C++ Express 2008 来跟踪程序。一旦发生死锁,我只是暂停程序并跟踪。我发现当死锁发生时,我的 C++ 扩展中会有两个名为 python 的线程。

他们都在python代码中使用了Queue,所以我猜死锁可能是由Queue引起的。但是,一旦扩展进入 python 代码,我只能从 VC++ 调试器中看到 asm 代码和二进制文件。

我想知道在我暂停程序后有什么方法可以转储python代码的调用堆栈吗?我怎么知道线程中有什么锁导致了死锁?

【问题讨论】:

Python 代码是从 C++ 程序调用的吗? 不,python程序导入了我写的一些c++扩展。 有趣的是,在python debugger documentation page上,没有thread这个词的踪迹。 如果线程停留在某个位置,此代码会打印线程的堆栈跟踪:gist.github.com/niccokunzmann/6038331 【参考方案1】:

如果您可以使用 gcc 编译您的扩展模块(例如,通过使用 Cygwin),您可以在这种情况下使用 gdb 和 pystack gdb 宏来获取 Python 堆栈。我不知道是否有可能在 Visual C++ Express 中做一些与 pystack 等效的事情,但无论如何你可能会从 pystack 宏实现中得到一些想法。

由于您提到您只能在 VC++ 调试器中看到 asm/binary,因此您应该确保使用调试符号编译 Python。如果 VC++ 仍然显示 asm,则可能是您需要告诉 VC++ 源文件在哪里(抱歉,多年来没有使用 VC++,所以如果是这种情况,我不知道您可能需要做什么) .

您还可以通过在代码中添加大量日志调用来获取一些重要信息,包括 Python 端和 C++ 扩展。

无论如何,我几乎可以肯定死锁不是由于队列,而是您自己的代码。

【讨论】:

你说得对,我发现死锁的根源是DirectShow。

以上是关于如何用Eclipse调试JBoss AS 7和WildFly8容器自身的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse 中的 JBoss 调试

无法使用 JBoss Web 2.1.4 windows 和 eclipse 设置远程调试

迁移到 Jboss 7.0 AS 后 Firefox 和 IE 中的 ViewExpiredException

[Rom]如何用Android源码生成签名文件

JBoss AS 7中的server.xml等价物

如何关闭 JBoss AS 7 服务器?