linux C++出力debugとtrace情報
(ここではLINUX G++環境を指す)
1、3つの重要なマクロ:
1 __LINE__ 現在の行番号
2 __FILE__ 現在のファイル名(xxx.cpp)
3 __PRETTY_FUNCTION__/__FUNCTION__ 署名付き関数名と署名なし関数名
二、stack traceを印刷する
次の2つの関数を使用します.
backtrace();
backtrace_symbols();
-g-rdynamicパラメータが必要です
コンパイルと出力
:!g++ -Wall -g -rdynamic ddd.cpp;./a.out
35
ddd.cpp
int main(int, char**)
Obtained 5 stack frames.
./a.out(_Z11print_tracev+0x16) [0x40090e]
./a.out(_Z4testv+0x9) [0x40098d]
./a.out(main+0x50) [0x4009e0]
/lib64/tls/libc.so.6(__libc_start_main+0xdb) [0x302af1c4bb]
./a.out(__gxx_personality_v0+0x42) [0x40086a]
本文は“木又寸の技術のブログ”のブログから出て、転載して作者と連絡してください!
1、3つの重要なマクロ:
1 __LINE__ 現在の行番号
2 __FILE__ 現在のファイル名(xxx.cpp)
3 __PRETTY_FUNCTION__/__FUNCTION__ 署名付き関数名と署名なし関数名
二、stack traceを印刷する
次の2つの関数を使用します.
backtrace();
backtrace_symbols();
-g-rdynamicパラメータが必要です
- #include <stdio.h>
- #include <exception>
- #include "string.h"
- #include "stdlib.h"
- #include <execinfo.h>
-
- void print_trace();
- void test();
-
- void print_trace (void)
- {
- void *array[10];
- size_t size;
- char **strings;
- size_t i;
-
- size = backtrace (array, 10);
- strings = backtrace_symbols (array, size);
-
- printf ("Obtained %zd stack frames.
", size);
-
- for (i = 0; i < size; i++)
- printf ("%s
", strings[i]);
-
- free (strings);
- }
-
- void test()
- {
- print_trace();
- }
-
- int main(int argc, char *argv[])
- {
- printf("%d
", __LINE__);
- printf("%s
", __FILE__);
- printf("%s
", __PRETTY_FUNCTION__);
-
- test();
- return 0;
- }
コンパイルと出力
:!g++ -Wall -g -rdynamic ddd.cpp;./a.out
35
ddd.cpp
int main(int, char**)
Obtained 5 stack frames.
./a.out(_Z11print_tracev+0x16) [0x40090e]
./a.out(_Z4testv+0x9) [0x40098d]
./a.out(main+0x50) [0x4009e0]
/lib64/tls/libc.so.6(__libc_start_main+0xdb) [0x302af1c4bb]
./a.out(__gxx_personality_v0+0x42) [0x40086a]
本文は“木又寸の技術のブログ”のブログから出て、転載して作者と連絡してください!