From Jérôme Duval <jerome.duval@xxxxxxxxx>:
Jérôme Duval has uploaded this change for review. (
https://review.haiku-os.org/c/haiku/+/5390 ;)
Change subject: strace: shows values for create_pipe and socketpair.
......................................................................
strace: shows values for create_pipe and socketpair.
---
M src/bin/debug/strace/Syscall.h
M src/bin/debug/strace/TypeHandler.cpp
M src/bin/debug/strace/strace.cpp
3 files changed, 43 insertions(+), 14 deletions(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/90/5390/1
diff --git a/src/bin/debug/strace/Syscall.h b/src/bin/debug/strace/Syscall.h
index 6b81b4e..b8af16e 100644
--- a/src/bin/debug/strace/Syscall.h
+++ b/src/bin/debug/strace/Syscall.h
@@ -19,7 +19,7 @@
class Type {
public:
Type(string typeName, TypeHandler *handler)
- : fTypeName(typeName), fHandler(handler) {}
+ : fTypeName(typeName), fHandler(handler), fCount(1) {}
const string &TypeName() const { return fTypeName; }
@@ -31,9 +31,13 @@
TypeHandler *Handler() const { return fHandler; }
+ uint32 Count() const { return fCount; }
+ void SetCount(uint32 count) { fCount = count; }
+
private:
string fTypeName;
TypeHandler *fHandler;
+ uint32 fCount;
};
// Parameter
diff --git a/src/bin/debug/strace/TypeHandler.cpp
b/src/bin/debug/strace/TypeHandler.cpp
index 4275f81..2d2d1ad 100644
--- a/src/bin/debug/strace/TypeHandler.cpp
+++ b/src/bin/debug/strace/TypeHandler.cpp
@@ -225,24 +225,39 @@
template<typename Type>
static string
-format_signed_integer_pointer(Context &context, void *address)
+format_signed_integer_pointer(Context &context, void *address, uint32 count)
{
Type data;
- if (obtain_pointer_data(context, &data, address,
Context::POINTER_VALUES))
- return "[" + context.FormatSigned(data, sizeof(Type)) + "]";
-
+ if (obtain_pointer_data(context, &data, address,
Context::POINTER_VALUES)) {
+ string formatted = "[" + context.FormatSigned(data);
+ for (uint32 i = 1; i < count; i++) {
+ address = (void*)((Type*)address + 1);
+ obtain_pointer_data(context, &data, address,
Context::POINTER_VALUES);
+ formatted += ", " + context.FormatSigned(data);
+ }
+ formatted += "]";
+ return formatted;
+ }
return context.FormatPointer(address);
}
template<typename Type>
static string
-format_unsigned_integer_pointer(Context &context, void *address)
+format_unsigned_integer_pointer(Context &context, void *address, uint32 count)
{
Type data;
- if (obtain_pointer_data(context, &data, address,
Context::POINTER_VALUES))
- return "[" + context.FormatUnsigned(data) + "]";
+ if (obtain_pointer_data(context, &data, address,
Context::POINTER_VALUES)) {
+ string formatted = "[" + context.FormatUnsigned(data);
+ for (uint32 i = 1; i < count; i++) {
+ address = (void*)((Type*)address + 1);
+ obtain_pointer_data(context, &data, address,
Context::POINTER_VALUES);
+ formatted += ", " + context.FormatUnsigned(data);
+ }
+ formatted += "]";
+ return formatted;
+ }
return context.FormatPointer(address);
}
@@ -279,29 +294,31 @@
template<typename Type>
class SignedIntegerPointerTypeHandler : public TypeHandler {
- string GetParameterValue(Context &context, Parameter *,
+ string GetParameterValue(Context &context, Parameter *parameter,
const void *address)
{
- return format_signed_integer_pointer<Type>(context, *(void
**)address);
+ return format_signed_integer_pointer<Type>(context, *(void
**)address,
+ parameter->Count());
}
string GetReturnValue(Context &context, uint64 value)
{
- return format_signed_integer_pointer<Type>(context, (void
*)value);
+ return format_signed_integer_pointer<Type>(context, (void
*)value, 1);
}
};
template<typename Type>
class UnsignedIntegerPointerTypeHandler : public TypeHandler {
- string GetParameterValue(Context &context, Parameter *,
+ string GetParameterValue(Context &context, Parameter *parameter,
const void *address)
{
- return format_unsigned_integer_pointer<Type>(context, *(void
**)address);
+ return format_unsigned_integer_pointer<Type>(context, *(void
**)address,
+ parameter->Count());
}
string GetReturnValue(Context &context, uint64 value)
{
- return format_unsigned_integer_pointer<Type>(context, (void
*)value);
+ return format_unsigned_integer_pointer<Type>(context, (void
*)value, 1);
}
};
diff --git a/src/bin/debug/strace/strace.cpp b/src/bin/debug/strace/strace.cpp
index 431bd64..5a23008 100644
--- a/src/bin/debug/strace/strace.cpp
+++ b/src/bin/debug/strace/strace.cpp
@@ -277,6 +277,14 @@
Syscall *wait = get_syscall("_kern_wait_for_child");
wait->ParameterAt(2)->SetOut(true);
wait->ParameterAt(3)->SetOut(true);
+
+ Syscall *createPipe = get_syscall("_kern_create_pipe");
+ createPipe->ParameterAt(0)->SetOut(true);
+ createPipe->ParameterAt(0)->SetCount(2);
+
+ Syscall *socketPair = get_syscall("_kern_socketpair");
+ socketPair->ParameterAt(3)->SetOut(true);
+ socketPair->ParameterAt(3)->SetCount(2);
}
--
To view, visit https://review.haiku-os.org/c/haiku/+/5390
To unsubscribe, or for help writing mail filters, visit
https://review.haiku-os.org/settings
Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I45ee381044b2e3d4ff0ed1daa61ac5bab949bcdb
Gerrit-Change-Number: 5390
Gerrit-PatchSet: 1
Gerrit-Owner: Jérôme Duval <jerome.duval@xxxxxxxxx>
Gerrit-MessageType: newchange