2013-12-17 21 views
2

我正在爲一家小型軟件公司工作,該公司正在製作Windows應用程序,並且該公司開發的IDE缺少對Valgrind或C運行時調試庫的支持。我們已經爲C編寫了一個基本的內存泄漏檢測程序,它通過在main()退出並檢查一個鏈接列表(用於記錄內存分配和釋放內存)之前設置一個斷點來處理未實現的內存。我們希望添加C++支持,但是由於內存釋放可能在main()在全局變量的析構函數內返回之後發生,因此在main的末尾添加斷點不再有效。使用gdb,可以在靜態對象銷燬後添加斷點嗎?

所以我想知道是否有辦法在靜態對象銷燬後添加斷點?順便說一句,我們使用的編譯器是Clang。

回答

1

C++靜態對象被破壞exit()。您可以在_exit()上放置一個斷點,此時所有靜態對象都必須被破壞。

請參閱回溯在Linux上的測試程序和сlang++編譯:

struct C { 
    C() : 
    ptr (new int) 
    { 
    } 

    ~C() 
    { 
    delete ptr; 
    } 
    int *ptr; 
}; 

C c; 

int main() 
{ 
    return 0; 
} 

這是一個GDB腳本:

set breakpoint pending on 
b _exit 
command 
bt 
c 
end 

b C::~C 
command 
bt 
c 
end 

b free 
command 
bt 
c 
end 

r 

這是一個測試本身:

gdb -q -x test.gdb ./a.out 
Reading symbols from /import/home/sergey.kurenkov/src/linux.x64.6.0/tests/test.break_after_static/a.out...done. 
Function "_exit" not defined. 
Breakpoint 1 (_exit) pending. 
Breakpoint 2 at 0x400680: C::~C. (2 locations) 
Function "free" not defined. 
Breakpoint 3 (free) pending. 

Breakpoint 2, C::~C (this=0x600be8 <c>) at main.cpp:8 
8   { 
#0 C::~C (this=0x600be8 <c>) at main.cpp:8 
#1 0x0000003c41235db2 in exit() from /lib64/libc.so.6 
#2 0x0000003c4121ece4 in __libc_start_main() from /lib64/libc.so.6 
#3 0x0000000000400519 in _start() 

Breakpoint 2, C::~C (this=0x600be8 <c>) at main.cpp:9 
9   delete ptr; 
#0 C::~C (this=0x600be8 <c>) at main.cpp:9 
#1 0x0000000000400685 in C::~C (this=0x600be8 <c>) at main.cpp:8 
#2 0x0000003c41235db2 in exit() from /lib64/libc.so.6 
#3 0x0000003c4121ece4 in __libc_start_main() from /lib64/libc.so.6 
#4 0x0000000000400519 in _start() 

Breakpoint 3, 0x0000003c4127a950 in free() from /lib64/libc.so.6 
#0 0x0000003c4127a950 in free() from /lib64/libc.so.6 
#1 0x00000000004006c0 in C::~C (this=0x600be8 <c>) at main.cpp:9 
#2 0x0000000000400685 in C::~C (this=0x600be8 <c>) at main.cpp:8 
#3 0x0000003c41235db2 in exit() from /lib64/libc.so.6 
#4 0x0000003c4121ece4 in __libc_start_main() from /lib64/libc.so.6 
#5 0x0000000000400519 in _start() 

Breakpoint 1, 0x0000003c412abc30 in _exit() from /lib64/libc.so.6 
#0 0x0000003c412abc30 in _exit() from /lib64/libc.so.6 
#1 0x0000003c41235d62 in exit() from /lib64/libc.so.6 
#2 0x0000003c4121ece4 in __libc_start_main() from /lib64/libc.so.6 
#3 0x0000000000400519 in _start() 
[Inferior 1 (process 13558) exited normally] 
(gdb) 

正如你所看到的C ::〜C()在exit()中被調用,C ::〜C()本身調用free()和th調用了_exit()。因此,在_ exit()上放置一個斷點,並檢查鏈接列表。如果我理解正確,你的鏈表必須是一個全局變量。

+0

GDB似乎無法找到_exit函數。這是一個Linux特定的事情嗎?如果是,是否有Windows相同?謝謝。 – user3109672

+0

它不是Linux專用的:http://pubs.opengroup.org/onlinepubs/009695399/functions/exit.html –

相關問題