mirror of
				https://github.com/go-delve/delve.git
				synced 2025-11-04 14:36:47 +08:00 
			
		
		
		
	We used to parse the .gopclntab section but removed support in favor of simply using DWARF debug information, due to lack of C symbols among other reasons. This makes it impossible to debug stripped binaries, which some distrubutions ship by default. Add back in basic support for .gopclntab which survives if the binary is stripped, allowing for rudimentary debugging such as basic program navigation, tracing, etc...
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package proc
 | 
						|
 | 
						|
type goroutineCache struct {
 | 
						|
	partialGCache map[int64]*G
 | 
						|
	allGCache     []*G
 | 
						|
 | 
						|
	allgentryAddr, allglenAddr uint64
 | 
						|
}
 | 
						|
 | 
						|
func (gcache *goroutineCache) init(bi *BinaryInfo) {
 | 
						|
	var err error
 | 
						|
 | 
						|
	exeimage := bi.Images[0]
 | 
						|
	rdr := exeimage.DwarfReader()
 | 
						|
	if rdr == nil {
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	gcache.allglenAddr, _ = rdr.AddrFor("runtime.allglen", exeimage.StaticBase, bi.Arch.PtrSize())
 | 
						|
 | 
						|
	rdr.Seek(0)
 | 
						|
	gcache.allgentryAddr, err = rdr.AddrFor("runtime.allgs", exeimage.StaticBase, bi.Arch.PtrSize())
 | 
						|
	if err != nil {
 | 
						|
		// try old name (pre Go 1.6)
 | 
						|
		gcache.allgentryAddr, _ = rdr.AddrFor("runtime.allg", exeimage.StaticBase, bi.Arch.PtrSize())
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (gcache *goroutineCache) getRuntimeAllg(bi *BinaryInfo, mem MemoryReadWriter) (uint64, uint64, error) {
 | 
						|
	if gcache.allglenAddr == 0 || gcache.allgentryAddr == 0 {
 | 
						|
		return 0, 0, ErrNoRuntimeAllG
 | 
						|
	}
 | 
						|
	allglen, err := readUintRaw(mem, gcache.allglenAddr, int64(bi.Arch.PtrSize()))
 | 
						|
	if err != nil {
 | 
						|
		return 0, 0, err
 | 
						|
	}
 | 
						|
 | 
						|
	allgptr, err := readUintRaw(mem, gcache.allgentryAddr, int64(bi.Arch.PtrSize()))
 | 
						|
	if err != nil {
 | 
						|
		return 0, 0, err
 | 
						|
	}
 | 
						|
	return allgptr, allglen, nil
 | 
						|
}
 | 
						|
 | 
						|
func (gcache *goroutineCache) addGoroutine(g *G) {
 | 
						|
	if gcache.partialGCache == nil {
 | 
						|
		gcache.partialGCache = make(map[int64]*G)
 | 
						|
	}
 | 
						|
	gcache.partialGCache[g.ID] = g
 | 
						|
}
 | 
						|
 | 
						|
// Clear clears the cached contents of the cache for runtime.allgs.
 | 
						|
func (gcache *goroutineCache) Clear() {
 | 
						|
	gcache.partialGCache = nil
 | 
						|
	gcache.allGCache = nil
 | 
						|
}
 |