我有一个想调试的汇编程序。如果这个程序是用符号汇编的,我可以直接在那个位置设置一个断点_start
,然后告诉 GDB 运行它,它就会立即中断,因为_start
可执行文件的定义就是从那里开始的。
但是,假设这个程序的符号被剥离了。那么,由于该符号不再存在,就无法设置断点了_start
。虽然我可以仔细检查可执行文件的头文件来找到定义的程序起始位置,但我已经非常熟悉这个操作了,所以我希望 GDB 能提供“以单步模式运行”的选项。然而,我在网上找不到任何关于如何做到这一点的信息。
我有一个想调试的汇编程序。如果这个程序是用符号汇编的,我可以直接在那个位置设置一个断点_start
,然后告诉 GDB 运行它,它就会立即中断,因为_start
可执行文件的定义就是从那里开始的。
但是,假设这个程序的符号被剥离了。那么,由于该符号不再存在,就无法设置断点了_start
。虽然我可以仔细检查可执行文件的头文件来找到定义的程序起始位置,但我已经非常熟悉这个操作了,所以我希望 GDB 能提供“以单步模式运行”的选项。然而,我在网上找不到任何关于如何做到这一点的信息。
我有一个宏来为程序定义初始化变量。该宏是...
(defmacro defparm (var value &key (frequency nil) (date nil date-supplied-p))
"Macro to define starting parameters."
`(let ((new-value (set-value ,value ,frequency)))
(cond ((eq ,date-supplied-p t)
(set-variation ',var new-value (make-date ,date)))
(t (setf (slot-value *my-parms* ',var) new-value)))))
该宏依赖于宏 set-value 和 set-variation,以及函数 is-date-p 和 is-percent-p。
(defun is-percent-p (value)
(cond ((and (symbolp value) (char= (char (symbol-name value) (1- (length (symbol-name value)))) #\%)))
((and (stringp value) (char= (char value (1- (length value))) #\%)))
(t nil)))
(defmacro set-value (value &optional frequency)
`(cond ((and (typep ',value 'symbol) (is-percent-p ',value))
(let ((new-value (string-right-trim "%" (symbol-name ',value))))
(/ (if (find #\. new-value)
(parse-float:parse-float new-value)
(parse-integer new-value :junk-allowed nil)) 100.0)))
(t ,value)))
我没有包括 is-date-p,因为它与这种情况无关,并且 set-variation 可以简单地被虚拟出来......
(defun set-variation (&rest x)
(declare (ignorable x)))
当我评估...
(defparm interest-rate 5%)
我明白了......
(defparm interest-rate 5%); 在:DEFPARM INTEREST-RATE;(SET-VALUE 5% NIL);--> IF IF AND IF TYPEP;==>;1;;捕获警告:;未定义变量:COMMON-LISP-USER::5%;;编译单元完成;未定义变量:;5%;捕获 1 警告条件 0.05 0.05
结果是正确的,0.05,但我不明白为什么会收到警告。
我已经输入(打印 nn)语句以尝试确定出现警告的位置,即评估 '5% 符号的位置,但我找不到它。
我的代码中的“警告”的实际点在哪里?!
使用此插件启动扫描时 '@capacitor/barcode-scanner'
但我有这个例外:
java.lang.NoSuchMethodError: No static method rememberComposableLambda(IZLjava/lang/Object;Landroidx/compose/runtime/Composer;I)Landroidx/compose/runtime/internal/ComposableLambda; in class Landroidx/compose/runtime/internal/ComposableLambdaKt; or its super classes (declaration of 'androidx.compose.runtime.internal.ComposableLambdaKt' appears in /data/app/~~mK_bGGqANgiVGzIdyQh2Yw==/com.mycompany.caisse.debug-ILKcoyuBxwK5azm899YlKw==/base.apk)
at com.outsystems.plugins.barcode.view.OSBARCScannerActivity$onCreate$3.invoke(OSBARCScannerActivity.kt:204)
at com.outsystems.plugins.barcode.view.OSBARCScannerActivity$onCreate$3.invoke(OSBARCScannerActivity.kt:198)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.ui.platform.ComposeView.Content(ComposeView.android.kt:428)
at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:252)
at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:251)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
at androidx.compose.ui.platform.CompositionLocalsKt.ProvideCommonCompositionLocals(CompositionLocals.kt:194)
at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:123)
at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:122)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)"
我的配置在那里:
1-构建.graddle(android):
"// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.2.1'
classpath 'com.google.gms:google-services:4.4.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
apply from: "variables.gradle"
allprojects {
repositories {
google()
mavenCentral()
maven {
url 'https://pkgs.dev.azure.com/OutSystemsRD/9e79bc5b-69b2-4476-9ca5-d67594972a52/_packaging/PublicArtifactRepository/maven/v1'
name 'Azure'
credentials {
username = "optional"
password = ""
}
content {
includeGroup "com.github.outsystems"
}
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
"
2-构建.graddle(应用程序):
"
apply plugin: 'com.android.application'
android {
namespace "com.mycompany.caisse"
compileSdk rootProject.ext.compileSdkVersion
defaultConfig {
applicationId "com.mycompany.caisse.debug"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 14
versionName "3.3.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
// Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
repositories {
flatDir{
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
implementation project(':capacitor-android')
testImplementation "junit:junit:$junitVersion"
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
implementation project(':capacitor-cordova-android-plugins')
}
apply from: 'capacitor.build.gradle'
try {
def servicesJSON = file('google-services.json')
if (servicesJSON.text) {
apply plugin: 'com.google.gms.google-services'
}
} catch(Exception e) {
logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
}
"
3- Graddle 信息:
"
Gradle 8.2.1
Build time: 2023-07-10 12:12:35 UTC
Revision: a38ec64d3c4612da9083cc506a1ccb212afeecaa
Kotlin: 1.8.20
Groovy: 3.0.17
Ant: Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM: 17.0.12 (Oracle Corporation 17.0.12+8-LTS-286)
OS: Windows 11 10.0 amd64
"
使用此插件启动扫描时 '@capacitor/barcode-scanner'
需要帮助来解决此异常
我总是在交互式会话中使用 GDB(gdb --args <program>
)
两个问题:
是否可以配置.gdbinit
自动生成核心转储文件?
与第一个问题相关,如果程序崩溃,是否有 GDB 会话命令可以手动生成核心转储文件?
我正在x86-64上调试 PCIe 枚举和配置,RC 和端点之间有一个 PCIe 交换机。我想添加printks
Linux 内核来观察CONFIG 0
和CONFIG 1
处理 TLP。
哪些内核源文件负责触发和处理这些 TLP?
我已经检查了驱动程序/pci,但需要指导如何确定代码路径。任何调试提示或相关文档的参考都将不胜感激。
我正在为 C++ 和 LUA 项目推出自己的 LUA 调试器,但遇到了一点障碍。我尝试遵循 MobDebug 的实现来设置表达式监视,在删除所有花哨的东西之后,它本质上归结为将要监视的表达式字符串连接到语句中return(...)
并运行它。确切的行是:
local func, res = mobdebug.loadstring("return(" .. exp .. ")")
只要您只是调试一个脚本并且大多数变量都位于全局环境中,这就可以完美地工作,但出于我自己的目的,我试图将这些return(...)
表达式的评估限制/范围缩小到某些表及其字段。
更具体地说,我正在使用该模式处理一些 LUA“类” setmetatable / __index
,并且,如果可以访问该表(我们称之为SomeClass
),我希望能够评估如下表达式
self.mSomeVariable + self.mSomeOtherVariable - self:someOperation(...)
其中self
指的是SomeClass
(即存在SomeClass:someOperation
,等等)。
我真的不知道该如何解决这个问题。起初我尝试了以下方法,但显然没有效果。
> SomeClass = {}
> SomeClass.DebugEval = function(self, chunk_str) return load("return(" .. chunk_str .. ")")() end
> SomeClass.DebugEval(SomeClass, "print(1)") // 1 nil
> SomeClass.DebugEval(SomeClass, "print(SomeClass)") // table: 0000000000CBB5C0 nil
> SomeClass.DebugEval(SomeClass, "print(self)") // nil nil
self
我甚至无法通过将其直接传递给包装函数的参数来引用“类”,这让我怀疑这可能是一个upvalue
问题。也就是说,load(...)
是否为这个块的执行创建了一个闭包,而这个闭包无法到达参数self
……但为什么呢?它确实在那里???
无论如何,我的调试器后端已经在 C++ 上了,所以我想“没问题,我只需手动设置upvalue
。再次,我尝试使用执行以下操作lua_setupvalue
,但这也不起作用。我收到了运行时错误pcall
。
luaL_dostring(L, "SomeClass = {}"); // just for convenience; I could've done this manually
luaL_loadstring(L, "print(1)"); // [ ... , loadstring_closure ]
lua_getglobal(L, "SomeClass"); // [ ... , loadstring_closure, reference table]
lua_setupvalue(L, -2, 1); // [ ... , loadstring_closure] this returns '_ENV'
lua_pcall(L, 0, 0, 0); // getting LUA_ERRRUN
我在这里遗漏了什么?也许我完全用错误的方式处理这个问题?我的最终目标只是能够执行这些调试器监视,但仅限于某些类实例,这样我就可以根据每个实例启用监视并检查它们。是的,我绝对需要推出自己的调试器。这是一个很长的故事。任何帮助都值得感激。
我的 Ballerina 项目包含多台服务器。
HTTP 服务器充当 GraphQL 服务器的代理服务器。
当我从 VS Code 以调试模式启动 Ballerina 项目时,只有 HTTP 服务器以调试模式启动(即支持调试器断点)。虽然 GraphQL 服务器运行没有问题,但它不支持在调试器断点处暂停。
我想知道如何以调试模式启动 GraphQL 服务器。只为 GraphQL 服务器设置调试模式,而不为 HTTP 服务器设置调试模式,这样就可以了。
编辑:Ballerina 版本:2201.8.3
gdb 可以用来display
打印每一步的表达式。我想使用 gdb 格式化表达式printf
。我如何告诉 gdb 运行printf
每个步骤,类似于显示?
我正在看一个关于IDEA调试的教程。当我尝试尝试强制进入按钮时,我发现它不存在。快捷键alt + shift + f7仍然有效。
他们为什么删除这个按钮?其背后的必要性是什么?
我有高度定制的银行对账单功能。传输逻辑从调用 Controller 开始,该控制器从 SysOperationServiceController 扩展。在控制器的 main 方法中,我有这段代码:
public static void main(Args args)
{
BankStatementTransferController_SI controller;
controller = BankStatementTransferController_SI::newFromArgs(args);
controller.buildQuery();
controller.startOperation();
controller.refreshCallerRecord();
}
我能够对此进行调试,直到 startOperation 方法。主要逻辑在其他类中执行,该类扩展自 RunBaseBatch。这两个类都将“RunOn”属性设置为“Called from”。我在两个类中设置了断点,但在controller.BuildQuery()之后,该过程完成并且不会在任何断点处停止。
问题是如何调试这个类?