VS CODE
(win10開啟管理員權限,找到"C:\Program Files\Microsoft VS Code\Code.exe" 點擊屬性。選擇兼容性,勾選 “以管理員身份運行此程序” 確定即可)
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/u-boot", "args": [], "stopAtEntry": true, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "targetArchitecture": "arm", "miDebuggerPath":"/usr/bin/gdb-multiarch", "miDebuggerServerAddress": "localhost:1234", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] }
-exec add-symbol-file u-boot 0x7ff7f000
[answered Y; input not from terminal]
-exec set confirm off
VS CODE 在程序匯編入口打斷點
1、VS Code啟動gdbserver調試后會輸出以下信息
=thread-group-added,id="i1"
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
=cmd-param-changed,param="pagination",value="off"
system_vectors () at /home/user/workshop/rt-thread/libcpu/arm/cortex-a/vector_gcc.S:16
16 ldr pc, _vector_reset
可以獲取程序入口在 vector_gcc.S文件的16行,
【使用gdb-multiarch rtthread.elf 的target remote :1234 一樣也可以獲取程序入口】
$ gdb-multiarch rtthread.elf GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from rtthread.elf...done. (gdb) target remote :1234 Remote debugging using :1234 system_vectors () at /home/user/workshop/rt-thread/libcpu/arm/cortex-a/vector_gcc.S:16 16 ldr pc, _vector_reset
分析 vector_gcc.S 文件
.globl system_vectors system_vectors: ldr pc, _vector_reset ldr pc, _vector_undef ldr pc, _vector_swi ldr pc, _vector_pabt ldr pc, _vector_dabt ldr pc, _vector_resv ldr pc, _vector_irq ldr pc, _vector_fiq .globl _reset .globl vector_undef .globl vector_swi .globl vector_pabt .globl vector_dabt .globl vector_resv .globl vector_irq .globl vector_fiq _vector_reset: .word _reset
分析可知,程序入口在_reset 處,
.text
/* reset entry */
.globl _reset
_reset: #ifdef ARCH_ARMV8 /* Check for HYP mode */ mrs r0, cpsr_all and r0, r0, #0x1F mov r8, #0x1A cmp r0, r8 beq overHyped b continue overHyped: /* Get out of HYP mode */ adr r1, continue msr ELR_hyp, r1 mrs r1, cpsr_all and r1, r1, #0x1f ;@ CPSR_MODE_MASK orr r1, r1, #0x13 ;@ CPSR_MODE_SUPERVISOR msr SPSR_hyp, r1 eret continue: #endif /* set the cpu to SVC32 mode and disable interrupt */ cps #Mode_SVC
因此,將斷點放在_reset的匯編label處
在VS CODE的 BREAKPOINTS 窗口中添加 _reset 斷點
也可以自己添加label到匯編代碼中
bss_loop:
cmp r1,r2 /* check if data to clear */
strlo r0,[r1],#4 /* clear 4 bytes */ blo bss_loop /* loop until done */
然后在 BREAKPOINTS 窗口中添加 bss_loop 斷點
VS CODE 查看內存
1、在程序中增加dump函數,如下
2、VScode的監視(WATCH)窗口,是可以調用函數的, 在監視窗口 Add Expression,
memory_dump(argv, 32) memory_dump(0x7fffffffdb58, 32)
void memory_dump(void *ptr, int len)
{
int i; for (i = 0; i < len; i+=4) { if (i % 16 == 0 && i != 0) printf(" "); if (i % 64 == 0 && i != 0) printf("\n"); printf("%08x ", *((uint32_t *)(ptr + i))); } printf("\n"); }
其他方法
在“調試控制台 debug console”下用命令 “-exec x/8x argv "可以查看數組內容,那么在監視(watch)窗口下也可以添加"-exec x/8x argv", 調試的時候隨着單步F10,可以自動執行這個命令(不需要再調試控制台窗口手動執行命令)
Affinic Debugger
http://www.affinic.com/
Code::Blocks 20.03
1.) Run command to add the PPA repository:
sudo add-apt-repository ppa:codeblocks-devs/release
sudo apt update
#codeblocks-contrib 修改快捷鍵必須要安裝 sudo apt install codeblocks codeblocks-contrib
nightly-build codeblocks (不建議安裝,直接使用stable版本)
https://wxstuff.xaviou.fr/article/debian-repository.html
sudo -s
apt install apt-transport-https gvim /etc/apt/sources.list ##check version of Debian cat /etc/debian_version ##For Debian 9 (Stretch): deb https://apt.xaviou.fr/oldstable/ stretch main deb-src https://apt.xaviou.fr/oldstable/ stretch main ##And for Debian 10 (Buster): deb https://apt.xaviou.fr/stable/ buster main deb-src https://apt.xaviou.fr/stable/ buster main wget -O- https://apt.xaviou.fr/key.asc | apt-key add - touch /etc/apt/preferences.d/codeblocks gvim codeblocks Package: * Pin: origin apt.xaviou.fr Pin-Priority: 999 apt update apt install codeblocks
1)“File -> New -> Project”,選擇“Empty Project”並創建。
2)選中 Project,右鍵,選擇“Add files”,將 c/c++ 和 head files 加入工程。
3)選中 Project,右鍵,選擇“Properties”,“Project settings”選項卡中的“Makefile”填入Makefile 文件名,並勾選“This is a custom Makefile”。
4)選中 Project,右鍵,選擇“Properties”,“Build targets”選項卡中的“Output filename:”填入build后產生的elf文件 (bsp/qemu-vexpress-a9/rtthread.elf),不勾選 "Auto-generate filename prefix" 不勾選 "Auto-generate filename extension"
5)選中 Project,右鍵,選擇“Build options”,刪除“"Make" command”選項卡中所有的“$target”。(可以修改為執行腳本 sh build.sh, 如rt-thread 使用scons編譯,就可以直接寫scons)
Selected compiler 需要選擇系統已有的compiler(GNU GCC Compiler) 即使Makefile使用的是別的Compiler
6) 選中 Project,右鍵,選擇“Properties”,在debugger標簽下,配置下remote connection,debug選下中 填入type: TCP, IP address: localhost Port: 1234 即可
7) 打開codeblocks,配置setting->debuger,指向gdb-multiarch,另外勾選下do not run the debugee,可以防止程序直接運行
codeblocks的Command中可以輸入 stepi
如果Debugger log 窗口中提示:
No symbol table is loaded. Use the "file" command.
表示沒有指定elf文件,(也就是 4)中配置錯誤 “Build targets”選項卡中的“Output filename),此時可以在Command中 輸入 file ~/rt-thread/bsp/qemu-vexpress-a9/rtthread.elf (即file + elf路徑)
http://bbs.eeworld.com.cn/thread-480542-1-1.html
然后打開codeblocks,配置settings->compiler(可不配置),指向arm-none-eabi-
配置setting->debuger,指向arm-none-eabi-gdb,另外勾選下do not run the debugee,可以防止程序直接運行
接下來新建一個空的工程,將u-boot目錄下所有的.c;.h;.s;.S文件導入(有心情可以把沒用的刪掉,我是懶得煩了)
右擊工程名,打開properties,在debugger標簽下,配置下remote connection,填入localhost及1234即可。
這樣之后,直接點擊調試小圖標就可以開始調試uboot了,默認暫停在b reset這兒,可以按F7單步。
三,Relocating之后的處理
relocation之后的斷點需要重新定位symbols,可以參考http://www.denx.de/wiki/view/DULG/DebuggingUBoot
對於這塊a9板,可以用這個命令add-symbol-file u-boot 0x6FF83000,然后就能對上relocating之后的代碼了。
Code::Blocks自定義文件代碼高亮和自動補全
代碼高亮簡單的步驟說明:
Settings --> Editor... --> Syntax hignlighting... --> Syntax hignlighting for: MASM Assembly --> Filemasks...;
在編輯框中加上你要高亮的代碼后綴,比如我的就是*.s(中間逗號分割)。
C/C++ 文件 自動補全簡單的步驟說明:
Settings --> Editor... --> Code completion --> C/C++ parser(adv.);
在“File extentions to parse as source files...”下面編輯框中加入你要代碼自動完成的C/C++文件代碼后綴。
Eclipse
遠程手動運行方式
1、在目標板上運行 gdbserver,
2、配置CDT的Debug選項,步驟如下:
-
選中項目→菜單欄 ”Run“→Debug Configurations…
-
雙擊 C/C++ Remote Application 新建一個配置, Eclipse會根據當前選擇的項目初始化大部分配置,這里只需修改Debugger配置頁
-
在右下方點擊“Select other”,選擇“GDB(DSF) Manual Remote Debugging Launcher”,確認
-
選擇進入Debugger配置頁,在Main標簽中,GDB debugger 填寫 arm-linux-gdb,如果未加入PATH環境變量則應該填入絕對路徑, Stop on startup at (調試uboot填reset, 調試linux_kernel填start_kernel)
-
在Debugger配置頁的Shared Libraries標簽中,可以添加庫路徑,比如調試過程中要步入外部函數,就必須在這里給出帶調試信息的庫文件路徑,否則會找不到該函數的定義
-
在Debugger配置頁的Connection標簽中,Type選“TCP”,並填寫目標板上gdbserver監聽的IP和端口號
-
所有配置完成后,點 Debug調試
Eclipse 的DevStyle主題安裝
https://www.genuitec.com/products/devstyle/download/
help---->install new software---->Add---->輸入名字、輸入網址:
http://www.genuitec.com/updates/devstyle/ci/
等待Eclipse右下角Installing Software 100%, 安裝完畢后重啟即可
Sublime + SublimeGDB
安裝Package Control
Package Control用來方便的管理各種插件,其實他自己也是一個插件。它的官網是 https://packagecontrol.io/
使用ctrl+` (鍵盤左上角)快捷鍵 或者菜單 View > Show Console 打開python控制台,然后執行下面的命令即可安裝
- Click the
- Browse up a folder and then into the Installed Packages/ folder 【~/.config/sublime-text-3/Installed Packages】
- Download Package Control.sublime-package and copy it into the Installed Packages/ directory
- Restart Sublime Text
安裝 SublimeGDB
菜單Preferneces -> Package Control打開, 選擇 Install Package, 然后輸入SublimeGDB,點擊就可以安裝了。
修改配置文件
依次選擇Preferneces -> Package Settings -> SublimeGDB -> Settings – User
默認的快捷鍵(可以通過修改Default.sublime-keymap修改快捷鍵)
按鍵 功能
F5 開始調試
Ctrl+F5 停止調試
F9 設置斷點
F10 Step over,執行一步,不進入函數
F11 Step into,進入函數
Shift+F11 Step out,跳出函數
{ // All options in here can also be specified in your project settings // with a prepended "sublimegdb_". You probably want to // have something like this in your project settings: // // "settings": // { // "sublimegdb_workingdir": "${folder:${project_path:your_executable_name}}", // // NOTE: You MUST provide --interpreter=mi for the plugin to work // "sublimegdb_commandline": "gdb --interpreter=mi ./your_executable_name" // // } // // generalized pattern for using always the current open file with an executable name // as the current file // "settings": // { // "sublimegdb_workingdir": "${folder:${file}}", // // put your arguments hear // "sublimegdb_arguments": "", // // NOTE: You MUST provide --interpreter=mi for the plugin to work // "sublimegdb_commandline": "gdb --interpreter=mi --args ./${file_base_name}" // // // } // // If you want to debug different executables as part of the same project, you can add something // like this to your project settings: // // "settings": // { // "sublimegdb_executables": // { // "first_executable_name": // { // "workingdir": "${folder:${project_path:first_executable_name}}", // "commandline": "gdb --interpreter=mi ./first_executable" // }, // "second_executable_name": // { // "workingdir": "${folder:${project_path:second_executable_name}}", // "commandline": "gdb --interpreter=mi ./second_executable" // } // } // } // // When you start debugging, you will be prompted to choose from one of your executables. Any // settings not specified for that project will be searched in your project settings (with a // sublimegdb_ prefix), then in your user settings, then in the default settings. // // (Note: if you have multiple executables, and you have a breakpoint set in a source file which // is not included in the current executable, you may have to set either debug_ext or // i_know_how_to_use_gdb_thank_you_very_much.) // // ${home}, ${project_path:}, ${folder:}, ${file} and ${file_base_name} // tokens can be used in 'workingdir', 'commandline', 'arguments' options. // // ${home} is replaced with the value of the HOME environment variable. // // ${project_path:} tries to find a file with the given name in all the registered project folders and // returns the first file found, or the original file name if none is found. // Example: ${project_path:main.cpp} tries to find a file named "main.cpp" relative // to the current project's folders. If none is found, it is replaced with "main.cpp". // // ${folder:} is replaced with the dirname of the given path. // Example: ${folder:/path/to/file} is replaced with "/path/to". // "workingdir": "/tmp", // // ${file} is replaced with absolute path to currently open file (if any) // Example: /home/user/main.cpp // // ${file_base_name} is replaced with name without extension of currently // open file (if any) // Example: replaced with "main" for file "/home/user/main.cpp" "workingdir": "/home/user/workshop/Demo2", // NOTE: You MUST provide --interpreter=mi for the plugin to work // "commandline": "gdb --interpreter=mi ./executable", "commandline": "cmake . && make && gdb --interpreter=mi --args ./Demo", // Environments for running gdb and gdb server // Example: "env": {"DISPLAY": ":100"} "env": {"DISPLAY": ":100"}, // Arguments for the program. // Example: to run "./executable foo bar" // "arguments": "foo bar" // To provide user input (stdin) use // "arguments": "< input.dat" "arguments": "2 6", // GDB Server // Specify a command and working dir for launching a GDB Server // This is useful for dealing with "remote" servers that are actually locally // connected JTAG boxes "server_workingdir": "notset", "server_commandline": "notset", // The command to use to run the program. // If you are attaching to a remote program, you // probably want to change this to -exec-continue "exec_cmd": "-exec-run", // Load the image to the remote target "load_cmd": "-target-download", // Immediately run the target upload connecting // When attaching to a remote program, you // may want to set this to false "run_after_init": false, // Attempt to update stack information while the program is running // If your remote target does not support non-stop, set this to false "update_while_running" : false, // Attach to a remote target? This is needed here because "-gdb-set target-async 1" must be // done prior to attaching "attach_cmd" : "target remote 127.0.0.1:1234", //"attach_cmd" : "-gdb-set target remote 127.0.0.1:1234", error // For the larger binaries with lot of shared libraries // the loading within the gdb could take much longer. // Configure the thread wait timeout by setting gdb_timeout "gdb_timeout": 200, // Define debugging window layout (window split) // first define column/row separators, then refer to them to define cells "layout": { "cols": [0.0, 0.33, 0.66, 1.0], "rows": [0.0, 0.75, 1.0], "cells": [ // c1 r1 c2 r2 [0, 0, 3, 1], // -> (0.00, 0.00), (1.00, 0.75) [0, 1, 1, 2], // -> (0.00, 0.75), (0.33, 1.00) [1, 1, 2, 2], // -> (0.33, 0.75), (0.66, 1.00) [2, 1, 3, 2] // -> (0.66, 0.75), (1.00, 1.00) ] }, // visual stuff "breakpoint_scope": "keyword.gdb", "breakpoint_icon": "circle", "position_scope": "entity.name.class", "position_icon": "bookmark", "changed_variable_scope": "entity.name.class", "changed_variable_icon": "", // The group used for opening files "file_group": 0, "session_group": 1, "session_open": true, "console_group": 1, "console_open": true, "variables_group": 1, "variables_open": true, "callstack_group": 2, "callstack_open": true, "registers_group": 2, "registers_open": false, "disassembly_group": 2, "disassembly_open": false, // Set to "intel" for intel disassembly flavor. All other // values default to using "att" flavor. "disassembly_flavor": "att", "threads_group": 3, "threads_open": true, "breakpoints_group": 3, "breakpoints_open": true, // If set to true will push the layout before debugging // and pop it when debugging ends "push_pop_layout": true, // If set to true will close the gdb views when the // debugging session ends "close_views": true, // File to optionally write all the raw data read from and written to the gdb session and the inferior program. // Setting it to "stdout" will write the output to the python console "debug_file": "stdout", // Add "pending breakpoints" for symbols that are dynamically loaded from // external shared libraries "debug_ext" : false, // Whether to log the raw data read from and written to the gdb session and the inferior program. "debug": true, // Disables showing the error message dialog when something goes wrong "i_know_how_to_use_gdb_thank_you_very_much": false }
{ // All options in here can also be specified in your project settings // with a prepended "sublimegdb_". You probably want to // have something like this in your project settings: // // "settings": // { // "sublimegdb_workingdir": "${folder:${project_path:your_executable_name}}", // // NOTE: You MUST provide --interpreter=mi for the plugin to work // "sublimegdb_commandline": "gdb --interpreter=mi ./your_executable_name" // // } // // generalized pattern for using always the current open file with an executable name // as the current file // "settings": // { // "sublimegdb_workingdir": "${folder:${file}}", // // put your arguments hear // "sublimegdb_arguments": "", // // NOTE: You MUST provide --interpreter=mi for the plugin to work // "sublimegdb_commandline": "gdb --interpreter=mi --args ./${file_base_name}" // // // } // // If you want to debug different executables as part of the same project, you can add something // like this to your project settings: // // "settings": // { // "sublimegdb_executables": // { // "first_executable_name": // { // "workingdir": "${folder:${project_path:first_executable_name}}", // "commandline": "gdb --interpreter=mi ./first_executable" // }, // "second_executable_name": // { // "workingdir": "${folder:${project_path:second_executable_name}}", // "commandline": "gdb --interpreter=mi ./second_executable" // } // } // } // // When you start debugging, you will be prompted to choose from one of your executables. Any // settings not specified for that project will be searched in your project settings (with a // sublimegdb_ prefix), then in your user settings, then in the default settings. // // (Note: if you have multiple executables, and you have a breakpoint set in a source file which // is not included in the current executable, you may have to set either debug_ext or // i_know_how_to_use_gdb_thank_you_very_much.) // // ${home}, ${project_path:}, ${folder:}, ${file} and ${file_base_name} // tokens can be used in 'workingdir', 'commandline', 'arguments' options. // // ${home} is replaced with the value of the HOME environment variable. // // ${project_path:} tries to find a file with the given name in all the registered project folders and // returns the first file found, or the original file name if none is found. // Example: ${project_path:main.cpp} tries to find a file named "main.cpp" relative // to the current project's folders. If none is found, it is replaced with "main.cpp". // // ${folder:} is replaced with the dirname of the given path. // Example: ${folder:/path/to/file} is replaced with "/path/to". // "workingdir": "/tmp", // // ${file} is replaced with absolute path to currently open file (if any) // Example: /home/user/main.cpp // // ${file_base_name} is replaced with name without extension of currently // open file (if any) // Example: replaced with "main" for file "/home/user/main.cpp" "workingdir": "/home/user/workshop/rt-thread/bsp/qemu-vexpress-a9", // NOTE: You MUST provide --interpreter=mi for the plugin to work // "commandline": "gdb --interpreter=mi ./executable", "commandline": "gdb-multiarch --interpreter=mi --args ./rtthread.elf", // Environments for running gdb and gdb server // Example: "env": {"DISPLAY": ":100"} "env": {"DISPLAY": ":100"}, // Arguments for the program. // Example: to run "./executable foo bar" // "arguments": "foo bar" // To provide user input (stdin) use // "arguments": "< input.dat" "arguments": "2 6", // GDB Server // Specify a command and working dir for launching a GDB Server // This is useful for dealing with "remote" servers that are actually locally // connected JTAG boxes "server_workingdir": "notset", "server_commandline": "notset", // The command to use to run the program. // If you are attaching to a remote program, you // probably want to change this to -exec-continue "exec_cmd": "-exec-run", // Load the image to the remote target "load_cmd": "-target-download", // Immediately run the target upload connecting // When attaching to a remote program, you // may want to set this to false "run_after_init": false, // Attempt to update stack information while the program is running // If your remote target does not support non-stop, set this to false "update_while_running" : false, // Attach to a remote target? This is needed here because "-gdb-set target-async 1" must be // done prior to attaching "attach_cmd" : "target remote 127.0.0.1:1234", //"attach_cmd" : "-gdb-set target remote 127.0.0.1:1234", error // For the larger binaries with lot of shared libraries // the loading within the gdb could take much longer. // Configure the thread wait timeout by setting gdb_timeout "gdb_timeout": 200, // Define debugging window layout (window split) // first define column/row separators, then refer to them to define cells "layout": { "cols": [0.0, 0.33, 0.66, 1.0], "rows": [0.0, 0.75, 1.0], "cells": [ // c1 r1 c2 r2 [0, 0, 3, 1], // -> (0.00, 0.00), (1.00, 0.75) [0, 1, 1, 2], // -> (0.00, 0.75), (0.33, 1.00) [1, 1, 2, 2], // -> (0.33, 0.75), (0.66, 1.00) [2, 1, 3, 2] // -> (0.66, 0.75), (1.00, 1.00) ] }, // visual stuff "breakpoint_scope": "keyword.gdb", "breakpoint_icon": "circle", "position_scope": "entity.name.class", "position_icon": "bookmark", "changed_variable_scope": "entity.name.class", "changed_variable_icon": "", // The group used for opening files "file_group": 0, "session_group": 1, "session_open": true, "console_group": 1, "console_open": true, "variables_group": 1, "variables_open": true, "callstack_group": 2, "callstack_open": true, "registers_group": 2, "registers_open": false, "disassembly_group": 2, "disassembly_open": false, // Set to "intel" for intel disassembly flavor. All other // values default to using "att" flavor. "disassembly_flavor": "att", "threads_group": 3, "threads_open": true, "breakpoints_group": 3, "breakpoints_open": true, // If set to true will push the layout before debugging // and pop it when debugging ends "push_pop_layout": true, // If set to true will close the gdb views when the // debugging session ends "close_views": true, // File to optionally write all the raw data read from and written to the gdb session and the inferior program. // Setting it to "stdout" will write the output to the python console "debug_file": "stdout", // Add "pending breakpoints" for symbols that are dynamically loaded from // external shared libraries "debug_ext" : false, // Whether to log the raw data read from and written to the gdb session and the inferior program. "debug": true, // Disables showing the error message dialog when something goes wrong "i_know_how_to_use_gdb_thank_you_very_much": false }
參考
https://williamlfang.github.io/post/2019-02-20-sublimegdb--%E6%9B%B4%E5%A5%BD%E7%94%A8%E7%9A%84%E8%BD%BB%E9%87%8F%E7%BA%A7-debugger/
{ "workingdir":"${folder:${file}}", "commandline":"gcc -ggdb3 -std=c11 ${file} -o ${file_base_name} && gdb --interpreter=mi --args ./${file_base_name}", // 可以直接調試 cmake 下的 bin/run 可執行文件 //"commandline":"gdb --interpreter=mi --args ../bin/run", "env": {"DISPLAY": ":100"}, "close_views": true, // Define debugging window layout (window split) // first define column/row separators, then refer to them to define cells "layout": { "cols": [0.0, 0.5, 1.0], "rows": [0.0, 0.65, 1.0], "cells": [ // c1 r1 c2 r2 [0, 0, 1, 1], // -> (0.0, 0.0), (0.5, 0.65) [1, 0, 2, 1], // -> (0.5, 0.0), (0.65, 1.0) [0, 1, 1, 2], // -> (0.0, 0.65), (1.0, 0.5) [1, 1, 2, 2] // -> (0.5, 0.65), (1.0, 1.0) ] // 布局結構 // // | c0:0 | c1:0.5 | c2:1.0 // r0:0.0 | ------------- | ------------- | // ------- | c0:r0 c1:r0 // ------- | =0# =1# // ------- | c1:r1 c2:r1 // r1:0.65 | ------------- | ------------- | // ------ | c0:r1 c1:r1 // ------ | =2# =3# // ------- | c1:r2 c2:r2 // r2:1.0 | ------------- | ------------- | }, // The group used for opening files "file_group": 0, "console_group": 1, "console_open": true, "session_group": 2, "session_open": true, "variables_group": 2, "variables_open": true, "callstack_group": 3, "callstack_open": true, "registers_group": 3, "registers_open": false, "disassembly_group": 3, "disassembly_open": true, // Set to "intel" for intel disassembly flavor. All other // values default to using "att" flavor. "disassembly_flavor": "intel", "threads_group": 3, "threads_open": true, "breakpoints_group": 3, "breakpoints_open": true, }