我的 Windows 11 上安装了 wsl2(ubuntu)。
我已经在 Windows 本地主机上设置了一个 gdb 侦听器服务器,并希望从 wsl2 访问它。但我的 Windows 机器和 wsl 虚拟机似乎使用不同的网络适配器。
>ipconfig
Windows IP Configuration
Ethernet adapter vEthernet (Default Switch):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::1114:bb:d0ad:93f8%18
IPv4 Address. . . . . . . . . . . : 172.29.192.1
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . …Run Code Online (Sandbox Code Playgroud) 我有这个 GDB TUI/布局。如何返回到默认的 GDB 视图?
我不能只是重新启动 GDB,因为我手头有重要的回溯,只要我有这些额外的窗口,我就无法在基本视图上很好地滚动。
我在 CentOS 7 上运行了 java(yeah java...) 应用程序。过了一会儿,有很多“已删除”的文件困扰着我。
对于使用的已删除文件(不是问题):
lsof | grep "(deleted)"
Run Code Online (Sandbox Code Playgroud)
我在 /proc/pid/fd/... 中找到了它们,我的问题是如何在不杀死进程的情况下杀死/删除它们(进程必须 24/7 运行)。
我在google上看到我可以使用gdb工具,但我不知道如何使用它。你能帮我吗(只是写一步一步的手册)?
如果您有其他建议,我很乐意听取。
我有一个 C 程序,它在深入陷入无限递归混乱之后对错误进行分段。在 GDB 中回溯过程是没有用的,因为调用堆栈帧至少有1000 帧深,并且重复的函数调用是一系列四个常见的递归函数调用(因此断点似乎没有用)。对 backtrace 的重复调用只是一遍又一遍地读出四个函数名称。我突然想到,做 'up' 'up' 'up'... 会让我更上一层楼,所以我可以看到这种模式首先开始发生的地方,但似乎从最顶层的调用开始会更有效堆栈帧并逐步下降,因为我的直觉是无限递归在过程的早期开始。如果调用堆栈总共有 N 帧,我知道我可以做
gdb>> up N
Run Code Online (Sandbox Code Playgroud)
到达堆栈的顶部(第 N 帧),但问题是我不知道 N。是否有用于查找调用堆栈中的总帧数的命令?或者,是否有一个巧妙的内置 GDB 命令用于跳转到最顶层的帧?我突然想到最顶层的框架应该是main()函数——我可以利用这些知识到达最顶层的框架吗?
make 然后失败了:
配置:错误:没有找到 termcap 库,但是 termcap 库就在那里,为什么找不到它?
checking for library containing zlibVersion... -lz
checking zlib.h usability... yes
checking zlib.h presence... yes
checking for zlib.h... yes
checking for library containing dlgetmodinfo... no
checking for iconv... yes
checking for iconv declaration... install-shextern size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
checking for library containing waddstr... no
configure: WARNING: no enhanced curses library found; disabling TUI
checking for library containing tgetent... no
configure: error: no termcap …Run Code Online (Sandbox Code Playgroud) 我需要知道如何将 Safari.app 中的内存转储到文件中。
我已经输入了 gdb attach 6741(我的 safari PID)。
怎么办?
我尝试在 google 上搜索 gdb 的帮助,但我找不到任何告诉我该怎么做的东西,即使搜索“如何在 gdb 中转储内存”:(
我尝试了“帮助转储”,它给了我一堆命令,但没有一个起作用。我最接近的是:
(gdb) dump memory ~/safaridump.bin 0
Missing stop address.
Run Code Online (Sandbox Code Playgroud)
那么停止地址是什么?我不知道?我怎么知道停止地址?我尝试在谷歌上搜索“缺少停止地址”gdb”,但没有帮助。我不知道如何获得停止地址。
我试过这个:
(gdb) 转储内存 ~/safaridump.bin 0 0xffffffff
那也没有用。
我懂了:
gdb stack crawl at point of internal error:
0 gdb-i386-apple-darwin 0x0012fd8f internal_vproblem + 316
1 gdb-i386-apple-darwin 0x0012ffd3 internal_verror + 43
2 gdb-i386-apple-darwin 0x00130008 align_down + 0
3 gdb-i386-apple-darwin 0x00130a21 xstrvprintf + 0
4 gdb-i386-apple-darwin 0x00130c25 xmalloc + 40
5 gdb-i386-apple-darwin 0x000045d6 dump_memory_to_file + 241
6 …Run Code Online (Sandbox Code Playgroud) 从自制软件(通过$ brew install gdb)安装 gdb 后,我按照这些说明授予 gdb 附加到进程的权限。
当我到达运行命令的步骤时:
$ codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误,退出代码为 1:
/usr/local/bin/gdb: errSecInternalComponent
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚出了什么问题,因此无法继续安装 gdb 的工作版本。有什么帮助吗?
额外信息:
Mac OS X 版本 10.14.4
GDB 8.3 版(通过自制软件)
将我的用户添加到_developer组中;没有帮助
尝试重新启动我的机器sudo killall taskgated但无济于事
尝试安装早期版本的 GDB (8.0.1),但得到相同的结果
我正在运行 Ubuntu Linux。我有两个并排运行的打开的终端窗口。我希望能够按一次回车键,并将该击键发送到两个窗口。
(我正在做的是使用调试器在两个不同的系统上逐步执行一些代码,并且我不想在逐步执行代码时在窗口之间来回切换。)
谢谢!
背景:最后是 tl;dr
英雄联盟有一个旁观者模式,在这种模式下,您可以延迟 3 分钟观看其他人的比赛(基本上是重播)。 受欢迎的 LoL 网站 OP.GG想出了一种巧妙的方法,将这些观众游戏托管在他们自己的服务器上,从而使它们可重玩,而不是仅在游戏运行时可用(就像 Riot 那样)。
如果您从 OP.GG 请求重播,它会发送一个批处理文件,查找联盟所在的位置,然后神奇的事情发生了:
@start "" "League of Legends.exe" "8394" "LoLLauncher.exe" "" "spectator fspectate.op.gg:4081 tjJbtRLQ/HMV7HuAxWV0XsXoRB4OmFBr 1391881421 NA1"
Run Code Online (Sandbox Code Playgroud)
这在 Windows 上运行良好。我正在尝试让它在 Mac(它有一个官方客户端)上运行。
首先我尝试手动运行相同的命令,(为了方便拆分)
/Applications/ ... /LeagueOfLegends.app/ ... /LeagueofLegends 8393 LoLLauncher \
/Applications/ ... /LolClient spectator fspectate.op.gg:4081 tjJbtRLQ/HMV7HuAxWV0XsXoRB4OmFBr 1391881421 NA1
Run Code Online (Sandbox Code Playgroud)
但是,运行它只会启动 LoLLauncher,它会关闭所有活动的 League 进程。如果我只是打电话,会发生完全相同的事情/Applications/ ... /LeagueOfLegends.app/ ... /LeagueofLegends
接下来,我尝试查看启动旁观者模式时实际发生的情况,因此我运行$ ps -axf | grep -i lol了显示
UID PID PPID C STIME TTY TIME CMD
503 3085 1 …Run Code Online (Sandbox Code Playgroud) 我在远程服务器上使用 GDB 7.6。
当我开始时gdb,一切都很好,只要要调试的程序没有运行。我可以使用向上和向下箭头浏览 GDB 历史记录等。没有要报告的显示错误。
当我在程序中的某处创建断点然后run调试程序时,显示有许多工件(字符显示在错误的位置),直到我运行refresh. 从那时起,next、stepi、nexti、 向上和向下箭头等都可以使用,但显示器继续在错误的位置绘制字符。如果我不在refresh每一步都运行,则显示不是它应该的样子。此外,当我按下向上或向下箭头键时,会显示原始字符代码^[[A或^[[B,不允许知道将执行哪个历史命令。
我尝试定义钩子
define hook-nexti
refresh
end
Run Code Online (Sandbox Code Playgroud)
这实际上刷新了屏幕,但有时仍然会出现不需要的工件(尤其是在执行代码的突出显示行上)并且不是一个可接受的解决方案,因为我不需要在我的本地机器上使用钩子(GDB 7.11,zsh 5.0.2) .
我的机器上碰巧也有一个 GDB 7.7,可以重现该问题。这是在 GDB 7.7 和 GDB 7.11 之间修复的错误吗?如果是,我将只binutils-gdb从源代码编译,因为我在远程服务器上没有 root 访问权限。
当我使用
M-x gdb
Run Code Online (Sandbox Code Playgroud)
当大量源文件在 emacs 中打开时,emacs 中的默认目录通常与我的工作副本目录不同,以运行我想要运行的文件。键入我要调试的文件的正确完整路径总是很痛苦。我怎么能解决这个问题?有没有办法将当前默认目录更改为我的项目的工作副本?
如何在 Arch Linux 上安装 GNU 调试器 (gdb)?我已经通过运行以下命令检查了我尚未安装 gdb:
gdb -help
Run Code Online (Sandbox Code Playgroud)
我试过这个:
sudo apt-get install gdb
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
gdb ×12
linux ×2
macos ×2
arch-linux ×1
autotools ×1
build ×1
c ×1
centos ×1
code-signing ×1
command-line ×1
debug ×1
emacs ×1
gnome ×1
java ×1
lsof ×1
mac ×1
macos-mojave ×1
make ×1
networking ×1
process ×1
tcp ×1
terminal ×1
ubuntu ×1
windows-subsystem-for-linux ×1
wsl2 ×1