常使用gdb的人,可能都會嘗試撰寫command file來簡化一些反覆的動作,甚至在command file中自訂一些個人專屬的指令,在利用gdb command file來簡化debugging的過程中,或是進行自動化驗証的過程中,有時候會出現一些詢問訊息,來詢問使用者是否繼續?或是中斷?如果您不想被打斷,您可以下達下列幾項指令來關閉它。
set confirm off
set height 0
set width 0
2009年12月14日 星期一
2009年11月6日 星期五
在Linux環境中,如何比較兩個Binary File?
我們在發展程式的過程中,難免會遇到資料處理的流程,在資料處理的流程中,也許我們需要進行資料正確與否的驗証,驗証的方法當然很多,其中我們可以將記憶體中的資料抓出來,再進行比對,在Linux環境中,可以使用下列的方式進行Binary File的比對:
hexdump -C file1 > file1.txt
hexdump -C file2 > file2.txt
diff file1.txt file2.txt -y |less
hexdump -C file1 > file1.txt
hexdump -C file2 > file2.txt
diff file1.txt file2.txt -y |less
2009年11月3日 星期二
如何了解執行程式使用了哪些Shared Library
一般使用者如果想了解執行程式是Static?還是Dynamic Linking,只要使用file指令即可達到此目的,如:
$ file gdb
gdb: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, statically linked, not stripped
$file gdb
gdb: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped
但如果您想要知道執行程式使用了哪些Shared Library,就需要使用ldd指令,如:
$ ldd gdb
not a dynamic executable
$ ldd gdb
libncurses.so.5 => /usr/lib/libncurses.so.5 (0x002c9000)
libm.so.6 => /lib/tls/libm.so.6 (0x005fd000)
libexpat.so.0 => /usr/lib/libexpat.so.0 (0x007e6000)
libc.so.6 => /lib/tls/libc.so.6 (0x004cf000)
/lib/ld-linux.so.2 (0x004b0000)
$ file gdb
gdb: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, statically linked, not stripped
$file gdb
gdb: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped
但如果您想要知道執行程式使用了哪些Shared Library,就需要使用ldd指令,如:
$ ldd gdb
not a dynamic executable
$ ldd gdb
libncurses.so.5 => /usr/lib/libncurses.so.5 (0x002c9000)
libm.so.6 => /lib/tls/libm.so.6 (0x005fd000)
libexpat.so.0 => /usr/lib/libexpat.so.0 (0x007e6000)
libc.so.6 => /lib/tls/libc.so.6 (0x004cf000)
/lib/ld-linux.so.2 (0x004b0000)
2009年10月28日 星期三
建立Patch File的參數
當我們修改程式後,或是拿到新版的程式碼時,我們時常會想要了解新版或修改後的程式與前一版的差異,我們可以使用diff指令來達成;不過如果要像一般網路上建立Patch File,則可使用下列的參數:
diff -Nur forld#1 forld#2 > file
在Patch File中,正負符號(+-)代表不同的兩個檔案,@@符號用以標示差異處,正負符號後面的第一個數字代表從哪一行開始的內容有差異,第二個數字代表不同檔案裡,該有差異段落裡的內容行數。
diff -Nur forld#1 forld#2 > file
在Patch File中,正負符號(+-)代表不同的兩個檔案,@@符號用以標示差異處,正負符號後面的第一個數字代表從哪一行開始的內容有差異,第二個數字代表不同檔案裡,該有差異段落裡的內容行數。
2009年10月16日 星期五
kconfig-language.txt
這篇文章來自於http://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt
將其貼在個人部落格,只是為了方便未來尋找。
Introduction
------------
The configuration database is a collection of configuration options
organized in a tree structure:
+- Code maturity level options
| +- Prompt for development and/or incomplete code/drivers
+- General setup
| +- Networking support
| +- System V IPC
| +- BSD Process Accounting
| +- Sysctl support
+- Loadable module support
| +- Enable loadable module support
| +- Set version information on all module symbols
| +- Kernel module loader
+- ...
Every entry has its own dependencies. These dependencies are used
to determine the visibility of an entry. Any child entry is only
visible if its parent entry is also visible.
Menu entries
------------
Most entries define a config option; all other entries help to organize
them. A single configuration option is defined like this:
config MODVERSIONS
bool "Set version information on all module symbols"
depends on MODULES
help
Usually, modules have to be recompiled whenever you switch to a new
kernel. ...
Every line starts with a key word and can be followed by multiple
arguments. "config" starts a new config entry. The following lines
define attributes for this config option. Attributes can be the type of
the config option, input prompt, dependencies, help text and default
values. A config option can be defined multiple times with the same
name, but every definition can have only a single input prompt and the
type must not conflict.
Menu attributes
---------------
A menu entry can have a number of attributes. Not all of them are
applicable everywhere (see syntax).
- type definition: "bool"/"tristate"/"string"/"hex"/"int"
Every config option must have a type. There are only two basic types:
tristate and string; the other types are based on these two. The type
definition optionally accepts an input prompt, so these two examples
are equivalent:
bool "Networking support"
and
bool
prompt "Networking support"
- input prompt: "prompt" ["if" ]
Every menu entry can have at most one prompt, which is used to display
to the user. Optionally dependencies only for this prompt can be added
with "if".
- default value: "default" ["if" ]
A config option can have any number of default values. If multiple
default values are visible, only the first defined one is active.
Default values are not limited to the menu entry where they are
defined. This means the default can be defined somewhere else or be
overridden by an earlier definition.
The default value is only assigned to the config symbol if no other
value was set by the user (via the input prompt above). If an input
prompt is visible the default value is presented to the user and can
be overridden by him.
Optionally, dependencies only for this default value can be added with
"if".
- type definition + default value:
"def_bool"/"def_tristate" ["if" ]
This is a shorthand notation for a type definition plus a value.
Optionally dependencies for this default value can be added with "if".
- dependencies: "depends on"
This defines a dependency for this menu entry. If multiple
dependencies are defined, they are connected with '&&'. Dependencies
are applied to all other options within this menu entry (which also
accept an "if" expression), so these two examples are equivalent:
bool "foo" if BAR
default y if BAR
and
depends on BAR
bool "foo"
default y
- reverse dependencies: "select" ["if" ]
While normal dependencies reduce the upper limit of a symbol (see
below), reverse dependencies can be used to force a lower limit of
another symbol. The value of the current menu symbol is used as the
minimal value can be set to. If is selected multiple
times, the limit is set to the largest selection.
Reverse dependencies can only be used with boolean or tristate
symbols.
Note:
select should be used with care. select will force
a symbol to a value without visiting the dependencies.
By abusing select you are able to select a symbol FOO even
if FOO depends on BAR that is not set.
In general use select only for non-visible symbols
(no prompts anywhere) and for symbols with no dependencies.
That will limit the usefulness but on the other hand avoid
the illegal configurations all over.
kconfig should one day warn about such things.
- numerical ranges: "range" ["if" ]
This allows to limit the range of possible input values for int
and hex symbols. The user can only input a value which is larger than
or equal to the first symbol and smaller than or equal to the second
symbol.
- help text: "help" or "---help---"
This defines a help text. The end of the help text is determined by
the indentation level, this means it ends at the first line which has
a smaller indentation than the first line of the help text.
"---help---" and "help" do not differ in behaviour, "---help---" is
used to help visually separate configuration logic from help within
the file as an aid to developers.
- misc options: "option"[=]
Various less common options can be defined via this option syntax,
which can modify the behaviour of the menu entry and its config
symbol. These options are currently possible:
- "defconfig_list"
This declares a list of default entries which can be used when
looking for the default configuration (which is used when the main
.config doesn't exists yet.)
- "modules"
This declares the symbol to be used as the MODULES symbol, which
enables the third modular state for all config symbols.
- "env"=
This imports the environment variable into Kconfig. It behaves like
a default, except that the value comes from the environment, this
also means that the behaviour when mixing it with normal defaults is
undefined at this point. The symbol is currently not exported back
to the build environment (if this is desired, it can be done via
another symbol).
Menu dependencies
-----------------
Dependencies define the visibility of a menu entry and can also reduce
the input range of tristate symbols. The tristate logic used in the
expressions uses one more state than normal boolean logic to express the
module state. Dependency expressions have the following syntax:
::= (1)
'=' (2)
'!=' (3)
'(' ')' (4)
'!' (5)
'&&' (6)
'||' (7)
Expressions are listed in decreasing order of precedence.
(1) Convert the symbol into an expression. Boolean and tristate symbols
are simply converted into the respective expression values. All
other symbol types result in 'n'.
(2) If the values of both symbols are equal, it returns 'y',
otherwise 'n'.
(3) If the values of both symbols are equal, it returns 'n',
otherwise 'y'.
(4) Returns the value of the expression. Used to override precedence.
(5) Returns the result of (2-/expr/).
(6) Returns the result of min(/expr/, /expr/).
(7) Returns the result of max(/expr/, /expr/).
An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2
respectively for calculations). A menu entry becomes visible when it's
expression evaluates to 'm' or 'y'.
There are two types of symbols: constant and non-constant symbols.
Non-constant symbols are the most common ones and are defined with the
'config' statement. Non-constant symbols consist entirely of alphanumeric
characters or underscores.
Constant symbols are only part of expressions. Constant symbols are
always surrounded by single or double quotes. Within the quote, any
other character is allowed and the quotes can be escaped using '\'.
Menu structure
--------------
The position of a menu entry in the tree is determined in two ways. First
it can be specified explicitly:
menu "Network device support"
depends on NET
config NETDEVICES
...
endmenu
All entries within the "menu" ... "endmenu" block become a submenu of
"Network device support". All subentries inherit the dependencies from
the menu entry, e.g. this means the dependency "NET" is added to the
dependency list of the config option NETDEVICES.
The other way to generate the menu structure is done by analyzing the
dependencies. If a menu entry somehow depends on the previous entry, it
can be made a submenu of it. First, the previous (parent) symbol must
be part of the dependency list and then one of these two conditions
must be true:
- the child entry must become invisible, if the parent is set to 'n'
- the child entry must only be visible, if the parent is visible
config MODULES
bool "Enable loadable module support"
config MODVERSIONS
bool "Set version information on all module symbols"
depends on MODULES
comment "module support disabled"
depends on !MODULES
MODVERSIONS directly depends on MODULES, this means it's only visible if
MODULES is different from 'n'. The comment on the other hand is always
visible when MODULES is visible (the (empty) dependency of MODULES is
also part of the comment dependencies).
Kconfig syntax
--------------
The configuration file describes a series of menu entries, where every
line starts with a keyword (except help texts). The following keywords
end a menu entry:
- config
- menuconfig
- choice/endchoice
- comment
- menu/endmenu
- if/endif
- source
The first five also start the definition of a menu entry.
config:
"config"
This defines a config symbol and accepts any of above
attributes as options.
menuconfig:
"menuconfig"
This is similar to the simple config entry above, but it also gives a
hint to front ends, that all suboptions should be displayed as a
separate list of options.
choices:
"choice"
"endchoice"
This defines a choice group and accepts any of the above attributes as
options. A choice can only be of type bool or tristate, while a boolean
choice only allows a single config entry to be selected, a tristate
choice also allows any number of config entries to be set to 'm'. This
can be used if multiple drivers for a single hardware exists and only a
single driver can be compiled/loaded into the kernel, but all drivers
can be compiled as modules.
A choice accepts another option "optional", which allows to set the
choice to 'n' and no entry needs to be selected.
comment:
"comment"
This defines a comment which is displayed to the user during the
configuration process and is also echoed to the output files. The only
possible options are dependencies.
menu:
"menu"
將其貼在個人部落格,只是為了方便未來尋找。
Introduction
------------
The configuration database is a collection of configuration options
organized in a tree structure:
+- Code maturity level options
| +- Prompt for development and/or incomplete code/drivers
+- General setup
| +- Networking support
| +- System V IPC
| +- BSD Process Accounting
| +- Sysctl support
+- Loadable module support
| +- Enable loadable module support
| +- Set version information on all module symbols
| +- Kernel module loader
+- ...
Every entry has its own dependencies. These dependencies are used
to determine the visibility of an entry. Any child entry is only
visible if its parent entry is also visible.
Menu entries
------------
Most entries define a config option; all other entries help to organize
them. A single configuration option is defined like this:
config MODVERSIONS
bool "Set version information on all module symbols"
depends on MODULES
help
Usually, modules have to be recompiled whenever you switch to a new
kernel. ...
Every line starts with a key word and can be followed by multiple
arguments. "config" starts a new config entry. The following lines
define attributes for this config option. Attributes can be the type of
the config option, input prompt, dependencies, help text and default
values. A config option can be defined multiple times with the same
name, but every definition can have only a single input prompt and the
type must not conflict.
Menu attributes
---------------
A menu entry can have a number of attributes. Not all of them are
applicable everywhere (see syntax).
- type definition: "bool"/"tristate"/"string"/"hex"/"int"
Every config option must have a type. There are only two basic types:
tristate and string; the other types are based on these two. The type
definition optionally accepts an input prompt, so these two examples
are equivalent:
bool "Networking support"
and
bool
prompt "Networking support"
- input prompt: "prompt"
Every menu entry can have at most one prompt, which is used to display
to the user. Optionally dependencies only for this prompt can be added
with "if".
- default value: "default"
A config option can have any number of default values. If multiple
default values are visible, only the first defined one is active.
Default values are not limited to the menu entry where they are
defined. This means the default can be defined somewhere else or be
overridden by an earlier definition.
The default value is only assigned to the config symbol if no other
value was set by the user (via the input prompt above). If an input
prompt is visible the default value is presented to the user and can
be overridden by him.
Optionally, dependencies only for this default value can be added with
"if".
- type definition + default value:
"def_bool"/"def_tristate"
This is a shorthand notation for a type definition plus a value.
Optionally dependencies for this default value can be added with "if".
- dependencies: "depends on"
This defines a dependency for this menu entry. If multiple
dependencies are defined, they are connected with '&&'. Dependencies
are applied to all other options within this menu entry (which also
accept an "if" expression), so these two examples are equivalent:
bool "foo" if BAR
default y if BAR
and
depends on BAR
bool "foo"
default y
- reverse dependencies: "select"
While normal dependencies reduce the upper limit of a symbol (see
below), reverse dependencies can be used to force a lower limit of
another symbol. The value of the current menu symbol is used as the
minimal value
times, the limit is set to the largest selection.
Reverse dependencies can only be used with boolean or tristate
symbols.
Note:
select should be used with care. select will force
a symbol to a value without visiting the dependencies.
By abusing select you are able to select a symbol FOO even
if FOO depends on BAR that is not set.
In general use select only for non-visible symbols
(no prompts anywhere) and for symbols with no dependencies.
That will limit the usefulness but on the other hand avoid
the illegal configurations all over.
kconfig should one day warn about such things.
- numerical ranges: "range"
This allows to limit the range of possible input values for int
and hex symbols. The user can only input a value which is larger than
or equal to the first symbol and smaller than or equal to the second
symbol.
- help text: "help" or "---help---"
This defines a help text. The end of the help text is determined by
the indentation level, this means it ends at the first line which has
a smaller indentation than the first line of the help text.
"---help---" and "help" do not differ in behaviour, "---help---" is
used to help visually separate configuration logic from help within
the file as an aid to developers.
- misc options: "option"
Various less common options can be defined via this option syntax,
which can modify the behaviour of the menu entry and its config
symbol. These options are currently possible:
- "defconfig_list"
This declares a list of default entries which can be used when
looking for the default configuration (which is used when the main
.config doesn't exists yet.)
- "modules"
This declares the symbol to be used as the MODULES symbol, which
enables the third modular state for all config symbols.
- "env"=
This imports the environment variable into Kconfig. It behaves like
a default, except that the value comes from the environment, this
also means that the behaviour when mixing it with normal defaults is
undefined at this point. The symbol is currently not exported back
to the build environment (if this is desired, it can be done via
another symbol).
Menu dependencies
-----------------
Dependencies define the visibility of a menu entry and can also reduce
the input range of tristate symbols. The tristate logic used in the
expressions uses one more state than normal boolean logic to express the
module state. Dependency expressions have the following syntax:
'('
'!'
Expressions are listed in decreasing order of precedence.
(1) Convert the symbol into an expression. Boolean and tristate symbols
are simply converted into the respective expression values. All
other symbol types result in 'n'.
(2) If the values of both symbols are equal, it returns 'y',
otherwise 'n'.
(3) If the values of both symbols are equal, it returns 'n',
otherwise 'y'.
(4) Returns the value of the expression. Used to override precedence.
(5) Returns the result of (2-/expr/).
(6) Returns the result of min(/expr/, /expr/).
(7) Returns the result of max(/expr/, /expr/).
An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2
respectively for calculations). A menu entry becomes visible when it's
expression evaluates to 'm' or 'y'.
There are two types of symbols: constant and non-constant symbols.
Non-constant symbols are the most common ones and are defined with the
'config' statement. Non-constant symbols consist entirely of alphanumeric
characters or underscores.
Constant symbols are only part of expressions. Constant symbols are
always surrounded by single or double quotes. Within the quote, any
other character is allowed and the quotes can be escaped using '\'.
Menu structure
--------------
The position of a menu entry in the tree is determined in two ways. First
it can be specified explicitly:
menu "Network device support"
depends on NET
config NETDEVICES
...
endmenu
All entries within the "menu" ... "endmenu" block become a submenu of
"Network device support". All subentries inherit the dependencies from
the menu entry, e.g. this means the dependency "NET" is added to the
dependency list of the config option NETDEVICES.
The other way to generate the menu structure is done by analyzing the
dependencies. If a menu entry somehow depends on the previous entry, it
can be made a submenu of it. First, the previous (parent) symbol must
be part of the dependency list and then one of these two conditions
must be true:
- the child entry must become invisible, if the parent is set to 'n'
- the child entry must only be visible, if the parent is visible
config MODULES
bool "Enable loadable module support"
config MODVERSIONS
bool "Set version information on all module symbols"
depends on MODULES
comment "module support disabled"
depends on !MODULES
MODVERSIONS directly depends on MODULES, this means it's only visible if
MODULES is different from 'n'. The comment on the other hand is always
visible when MODULES is visible (the (empty) dependency of MODULES is
also part of the comment dependencies).
Kconfig syntax
--------------
The configuration file describes a series of menu entries, where every
line starts with a keyword (except help texts). The following keywords
end a menu entry:
- config
- menuconfig
- choice/endchoice
- comment
- menu/endmenu
- if/endif
- source
The first five also start the definition of a menu entry.
config:
"config"
This defines a config symbol
attributes as options.
menuconfig:
"menuconfig"
This is similar to the simple config entry above, but it also gives a
hint to front ends, that all suboptions should be displayed as a
separate list of options.
choices:
"choice"
"endchoice"
This defines a choice group and accepts any of the above attributes as
options. A choice can only be of type bool or tristate, while a boolean
choice only allows a single config entry to be selected, a tristate
choice also allows any number of config entries to be set to 'm'. This
can be used if multiple drivers for a single hardware exists and only a
single driver can be compiled/loaded into the kernel, but all drivers
can be compiled as modules.
A choice accepts another option "optional", which allows to set the
choice to 'n' and no entry needs to be selected.
comment:
"comment"
This defines a comment which is displayed to the user during the
configuration process and is also echoed to the output files. The only
possible options are dependencies.
menu:
"menu"
如何使用vim來編輯hex檔?
先前曾經記載了如何使用vim來檢視hex檔,當時因為苦於編修完無法存檔,前幾日剛好看到同事正在使用,特別請教一下,並記錄於此,方法如下:
欲看hex mode的指令:
:%!xxd
欲在hex mode編輯文件,方法同一般文件:
按'i'鍵,讓vim進入insert mode,即可編輯。
欲儲存編修過的hex內容:
必須先讓文件離開hex mode:
:%!xxd -r
然後再儲存:
:wq or :w!
大家可以試試看!
欲看hex mode的指令:
:%!xxd
欲在hex mode編輯文件,方法同一般文件:
按'i'鍵,讓vim進入insert mode,即可編輯。
欲儲存編修過的hex內容:
必須先讓文件離開hex mode:
:%!xxd -r
然後再儲存:
:wq or :w!
大家可以試試看!
2009年9月9日 星期三
如何在vim中使用滑鼠
以下內容抄自同事的.vimrc(據其指出,也是抄自網路上其它高手),這裡只是方便偶要查詢參數設定時,可以回到自己的Blog查詢。
" set mouse=a, let you be able to change cursor by mouse
set mouse=a
" following two lines remap copy/paste plus shit key
map m :set mouse=a<cr>
map <leader>m :set mouse=<cr>
" make your scrolling to control up and down
set ttymouse=xterm
:map <M-Esc>[62~ <MouseDown>
:map! <M-Esc>[62~ <MouseDown>
:map <M-Esc>[63~ <MouseUp>
:map! <M-Esc>[63~ <MouseUp>
:map <M-Esc>[64~ <S-MouseDown>
:map! <M-Esc>[64~ <S-MouseDown>
:map <M-Esc>[65~ <S-MouseUp>
:map! <M-Esc>[65~ <S-MouseUp>
如果您有興趣進一步了解,亦可參考http://www.vim.org/htmldoc/scroll.html
" set mouse=a, let you be able to change cursor by mouse
set mouse=a
" following two lines remap copy/paste plus shit key
map m :set mouse=a<cr>
map <leader>m :set mouse=<cr>
" make your scrolling to control up and down
set ttymouse=xterm
:map <M-Esc>[62~ <MouseDown>
:map! <M-Esc>[62~ <MouseDown>
:map <M-Esc>[63~ <MouseUp>
:map! <M-Esc>[63~ <MouseUp>
:map <M-Esc>[64~ <S-MouseDown>
:map! <M-Esc>[64~ <S-MouseDown>
:map <M-Esc>[65~ <S-MouseUp>
:map! <M-Esc>[65~ <S-MouseUp>
如果您有興趣進一步了解,亦可參考http://www.vim.org/htmldoc/scroll.html
籍由ctags來讓vim更方便
以往偶在看程式時,大都使用grep指令,搭配vim來進行,如需進一步tracing時,才會使用到gdb來看看程式的行為。今日偶又從同事身上學到一招----用ctags來建立tags檔,然後便可以在vim中,直接跳躍到函式實作的位置去,方法如下:
1.)在欲建立tags檔的目錄下,執行ctags指令:
$) ctags -R directory
2.)使用vim將程式檔案開啟。
$) vim xxx.c
3.)載入tags檔。
:ta tags or :set tags=../../tags
4.)當您游標移至某函式呼叫上時,您可以執行ctrl+],vim會立即跳至該函式的實作位置。
5.)若您要跳回程式原來的地方,您可以執行ctrl+T,vim會立即跳至原來呼叫該函式的位置。
6.)若您有遇到多重符合的函數或字串,您可以使用下列指令來切換選擇。
:tnext
或
:tselect tarname
詳情可參考man ctags
1.)在欲建立tags檔的目錄下,執行ctags指令:
$) ctags -R directory
2.)使用vim將程式檔案開啟。
$) vim xxx.c
3.)載入tags檔。
:ta tags or :set tags=../../tags
4.)當您游標移至某函式呼叫上時,您可以執行ctrl+],vim會立即跳至該函式的實作位置。
5.)若您要跳回程式原來的地方,您可以執行ctrl+T,vim會立即跳至原來呼叫該函式的位置。
6.)若您有遇到多重符合的函數或字串,您可以使用下列指令來切換選擇。
:tnext
或
:tselect tarname
詳情可參考man ctags
訂閱:
文章 (Atom)