2013-04-05 46 views
1

我有一個程序在啓動時加載一大塊數據。這需要相當長的時間,因此在運行Valgrind (memcheck)/DrMemory時會產生開銷。因此數次使用不同的參數調用程序時,它佔用了大量的時間在Valgrind/DrMemory中記錄程序狀態,然後恢復它是否可行?

我的想法是使用fork()數據加載階段之後再用手將孩子送到Valgrind的/ DrMemory。即使加載階段在Valgrind/DrMemory下運行,開銷也只會發生一次,所有子進程都應該能夠使用預加載的數據。

記錄程序狀態並將其聲明爲未知狀態,然後在Valgrind(memcheck)或DrMemory中恢復該狀態是否可行?

注意:我只對unixoid平臺感興趣,僅限於Linux平臺也可以。

回答

1

我的想法是在數據加載階段之後立即使用fork(),然後將子對象交給Valgring/DrMemory。

這是不可行的,原因很多。例如,glibc會將syscall(SYS_getpid)的結果緩存在一個內部變量中,並且有多個進程相信它們具有相同的pid(其實際pid爲!=),這是明顯的災難性配方。

這就是說,什麼阻止你運行初始化後的子進程valgrind --trace-children=yes然後fork?每個子進程可以做這樣的事情:

char buf[PATH_MAX]; 
sprintf(buf, "/tmp/parameters-for-%d", getpid()); 
while (true) { 
    if (FILE *fp = fopen(buf, "r")) { 
    // read parameters for this child, and exercise appropriate code paths 
    return run_with_parameters(fp); 
    } 
    sleep(1); 
} 

當你想要孩子N運行,只需echo "foo bar baz" > /tmp/parameters-for-N並等待它完成。所有其他孩子都會很忙,等待你準備好使用它們。

+0

所以你說的是從一開始就在Valgrind下運行它,並且簡單地使用'fork()'? – 0xC0000022L 2013-04-15 12:59:46

+0

@ 0xC0000022L是的,正好。沒有特別的支持(超越追蹤兒童的能力)是必要的。 – 2013-04-15 13:58:15

+0

太棒了,那實際上回答了我的問題。 Спасибобольшое! – 0xC0000022L 2013-04-15 14:00:47

相關問題